home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1998 #2 / Amiga Plus CD - 1998 - No. 2.iso / pd / musik / digiboosterpro / sources / dbm0player.s.lha / DBM0player.s
Text File  |  1997-09-17  |  64KB  |  4,395 lines

  1. ;----------------- DIGI Booster PRO By Tap & Walt ----------------
  2. ;             player v 2.12 pure code                     ;
  3. ;             by Tap - Tomasz Piasta                      ;
  4. ;-----------------------------------------------------------------
  5.  
  6.     incdir    include:
  7.     include    lvo/exec_lib.i
  8.     include lvo/gadtools_lib.i
  9.     include    lvo/ahi_lib.i
  10.     include    devices/ahi.i
  11.     include    "utility/hooks.i"
  12.  
  13.  
  14. Open        equ    -30
  15. Close        equ     -36
  16. Read        equ    -42
  17. ModeRead    equ    1005
  18.  
  19. Lock        =-84
  20. UnLock        =-90
  21. Examine        =-102
  22. ExNext        =-108
  23. AccesRead    =-2
  24.  
  25. Write        equ -48
  26. ModeWrite    equ 1006    
  27.  
  28. s:
  29.     move.l    4.w,a6
  30.     lea    DosName,a1
  31.     moveq    #0,d0
  32.     jsr    _LVOOpenLibrary(a6)
  33.     move.l    d0,DosBase
  34.  
  35.     move.l    4.w,a6
  36.     lea    ReqName,a1
  37.     moveq    #0,d0
  38.     jsr    _LVOOpenLibrary(a6)
  39.     move.l    d0,ReqBase
  40.  
  41.     move.l    #NM,ReadName
  42.     jsr    DBM0
  43.  
  44.     cmp.w    #1,LoadModError
  45.     beq.w    .WASERROR
  46.  
  47.     clr.w    SongPos
  48.     clr.w    PattPos
  49.     clr.w    FirstTrack
  50.     clr.w    PattPos
  51.     clr.b    count
  52.     moveq    #0,d0
  53.     move.w    GeneralSpeed,d0
  54.     move.b    d0,Orgtemp
  55.     bset    #1,$bfe001
  56.     move.b    Orgtemp,count
  57.     move.w    GeneralTempo,CiaTempo
  58.  
  59.     lea    Channel1+PANPOS,a0
  60.     moveq    #128/2-1,d7
  61. .SetPan
  62.     move.l    #$4000,(a0)
  63.     lea    ChanArea(a0),a0
  64.     move.l    #$c000,(a0)
  65.     lea    ChanArea(a0),a0
  66.     dbf    d7,.SetPan
  67.  
  68. .retry
  69.     jsr    ahi_initstart
  70.     tst.l    d0
  71.     beq.s    .ok
  72.     bsr    OpenAhiError
  73.     cmp.w    #1,d0
  74.     beq.s    .retry
  75.     clr.l    AhiBase
  76.     bra    .end
  77. .ok
  78.     move.b    #6,Temp
  79. .Loop:
  80.     move.l    DosBase,a6
  81.     moveq    #1,d1
  82.     jsr    -198(a6)
  83.     btst    #6,$bfe001
  84.     bne.s    .Loop
  85.  
  86.     jsr    Ahi_End
  87. .END
  88.     jsr    FreeModule
  89. .WASERROR
  90.     rts
  91.  
  92. DOSName:    dc.b    "dos.library",0
  93. reqname:    dc.b    'reqtools.library',0
  94.         even
  95. DosBase:    dc.l    0
  96. ReqBase:    dc.l    0
  97. ReadName:    dc.l    0
  98.  
  99. GeneralTempo:    dc.w    125
  100. GeneralSpeed:    dc.w    6
  101. InstrNum:    dc.w    1
  102. FirstTrack:    dc.w    0
  103. ActualTrack:    dc.w    0
  104. TrackNumber:    dc.w    0
  105.  
  106. INSNUM:        dc.w    0
  107. PATNUM:        dc.w    0
  108. SNGNUM:        dc.w    0
  109. SMPNUM:        dc.w    0
  110.  
  111. OrdNum:        dc.w    0
  112.  
  113. OrdNum0:    dc.w    0
  114. OrdNum1:    dc.w    0
  115. OrdNum2:    dc.w    0
  116. OrdNum3:    dc.w    0
  117. OrdNum4:    dc.w    0
  118.  
  119. ActualSong:    dc.w    0
  120.  
  121. FileHandle:    dc.l    0
  122. LoadModError:    dc.w    0
  123. Mode16BitEn:    dc.w    0
  124.  
  125. PP_LENG:    dc.w    0
  126. PP_ADR:        dc.l    0
  127.  
  128. NoLoopEnable:    dc.w    0
  129. MIXITENABLE:    dc.w    0
  130.  
  131. playenable:    dc.w    0
  132. stopenable:    dc.w    0
  133.  
  134. OrgTemp:    dc.b    0
  135. SPAHIENABLE    dc.b    0
  136. PlayPattEn:    dc.w    0
  137. OldSPos:    dc.w    0
  138. EditEnable:    dc.w    0
  139. ACTCHAN:    dc.w    0
  140.         even
  141.     
  142. FreeModule:
  143.     lea    Channel1+OnOffChanA,a0
  144.     moveq    #128-1,d7
  145. .onoff    bclr    #0,(a0)
  146.     lea    ChanArea(a0),a0
  147.     dbf    d7,.onoff
  148.  
  149.     bsr    FreeSong
  150.     bsr    FreeSamples
  151.     rts
  152.  
  153. FreeSong:
  154.     move.l    #1024-1,d7
  155.     lea    PattAdresses,a5
  156.     lea    PattLens,a4
  157.     moveq    #0,d6
  158.     move.w    TrackNumber,d6
  159.     mulu    #6,d6
  160. FreePatts
  161.     move.l    4,a6
  162.  
  163.     moveq    #0,d5
  164.     move.w    (a4)+,d5
  165.     mulu    d6,d5
  166.     move.l    d5,d0
  167.  
  168.     move.l    (a5),a1        ;adres zajetej pamieci
  169.     tst.l    (a5)+
  170.     beq.s    FreePattsDone
  171.  
  172.     subq.l    #8,a1
  173.     addq.l    #8,d0
  174.     jsr    -210(a6)
  175.     clr.l    -4(a5)
  176. ;    clr.w    -2(a4)
  177.     dbf    d7,FreePatts
  178. FreePattsDone
  179.  
  180.  
  181.     lea    SongOrders,a1
  182.     move.l    #1024-1,d7
  183. MMMCLR1    clr.w    (a1)+
  184.     dbf    d7,MMMCLR1
  185.  
  186.     lea    SongOrders0,a1
  187.     move.l    #[1024+1-1]*5,d7
  188. MMMCLR11
  189.     clr.w    (a1)+
  190.     dbf    d7,MMMCLR11
  191.  
  192.     bsr    ClrModName
  193.  
  194.     lea    SongNameBuffer,a1
  195.     move.w    #42-1,d7
  196. MMMCLR6    clr.b    (a1)+
  197.     dbf    d7,MMMCLR6
  198.  
  199.     lea    SongNameBuffer0,a1
  200.     move.w    #44*5-1,d7
  201. MMMCLR66
  202.     clr.b    (a1)+
  203.     dbf    d7,MMMCLR66
  204.  
  205.     clr.w    PATNUM
  206.     clr.w    ORDNUM
  207.     clr.w    ORDNUM0
  208.     clr.w    ORDNUM1
  209.     clr.w    ORDNUM2
  210.     clr.w    ORDNUM3
  211.     clr.w    ORDNUM4
  212.     clr.w    ActualSong
  213.     move.w    #64,GlobalVol
  214.  
  215.     clr.w    FirstTrack
  216.     rts
  217.  
  218.  
  219. ClrModName:
  220.     lea    ModNameBuffer,a1
  221.     move.w    #42-1,d7
  222. MMMCLR4    clr.b    (a1)+
  223.     dbf    d7,MMMCLR4
  224.     rts
  225.  
  226.  
  227.  
  228. FreeSamples:
  229.     move.l    #255-1,d7
  230.     lea    AHI_Samples,a5
  231. FreeSampleLoop
  232.     move.l    4,a6
  233.     move.l    (a5),a1            ;adres zajetej pamieci
  234.     move.l    4(a5),d0
  235.  
  236.     clr.l    8(a5)
  237.     clr.l    12(a5)
  238.     clr.l    4(a5)
  239.  
  240.     tst.l    (a5)
  241.     beq.s    FreeSamMKL
  242.  
  243.     cmp.l    #0,Ahi_Sound0
  244.     beq.s    .8bit
  245.     add.l    d0,d0
  246. .8bit
  247.  
  248.     clr.l    (a5)
  249.     subq.l    #8,a1
  250.     addq.l    #8,d0
  251.     jsr    -210(a6)
  252. FreeSamMKL
  253.     lea    16(a5),a5
  254.     dbf    d7,FreeSampleLoop
  255.  
  256.     lea    SamVol,a1
  257.     move.l    #256-1,d7
  258. MMMCLR2    clr.b    (a1)+
  259.     dbf    d7,MMMCLR2
  260.  
  261.     lea    samfin,a1
  262.     move.l    #256-1,d7
  263. MMMCLR3    move.l    #8363,(a1)+
  264.     dbf    d7,MMMCLR3
  265.  
  266.     lea    InstrNames,a1
  267.     move.l    #30*256/4-1,d7
  268. MMMCLR5    clr.l    (a1)+
  269.     dbf    d7,MMMCLR5
  270.  
  271.     lea    VolEnvelope,a1
  272.     move.l    #134*256/4-1,d7
  273. MMMCLR7    clr.l    (a1)+
  274.     dbf    d7,MMMCLR7
  275.  
  276.     lea    SampleType,a1
  277.     move.l    #256*2-1,d7
  278. MMMCLR8    clr.b    (a1)+
  279.     dbf    d7,MMMCLR8
  280.  
  281.     lea    LoopTab,a1
  282.     move.l    #256-1,d7
  283. MMMCLR9    clr.b    (a1)+
  284.     dbf    d7,MMMCLR9
  285.  
  286.     bsr    makeinstr
  287.  
  288.     clr.w    INSNUM
  289.     move.w    #64,GlobalVol
  290.  
  291.     tst.w    CANDO
  292.     beq.s    CANTDO
  293.     move.l    #AHIST_M8S,AHI_Sound0
  294.     clr.w    Mode16biten
  295. CANTDO
  296.     rts
  297.  
  298. CANDO:    dc.w    0
  299.  
  300. MakeInstr:
  301.     lea    Instruments,a0
  302.     move.l    #256-1,d7
  303.     moveq    #0,d0
  304. .mi
  305.     move.w    d0,(a0)+
  306.     addq    #1,d0
  307.     dbf    d7,.mi
  308.     rts
  309.  
  310. ChooseReqTitle:
  311.     dc.b    "Digi Booster 2.12 player Request",0
  312.     even
  313.  
  314. RT_TagBase        equ    $80000000
  315. RTEZ_ReqTitle        equ     (RT_TagBase+20)
  316. RTEZ_DefaultResponse    equ     (RT_TagBase+23)
  317. RT_Underscore        equ     (RT_TagBase+11)
  318. RT_ReqPos        equ     (RT_TagBase+3)
  319. REQPOS_CENTERSCR    equ     2
  320. rtEZRequestA        equ    -66
  321.  
  322. ChooseReqTags:
  323.     dc.l    RTEZ_ReqTitle,ChooseReqTitle
  324.     dc.l    RTEZ_DefaultResponse,1
  325.     dc.l    RT_Underscore,'_'
  326.     dc.l    RT_ReqPos,REQPOS_CENTERSCR
  327.     dc.l    0,0
  328.  
  329.  
  330. OpenChooseReq:
  331.     move.l    ReqBase,a6
  332.     lea    ChooseReqTags,a0
  333.     move.l    #0,a3
  334.     move.l    #0,a4
  335.     jsr    rtEZRequestA(a6)
  336.     rts
  337.  
  338. NotEnoughMemoryError
  339.     movem.l    d0-a6,-(sp)
  340.     move.l    #NoMemoryText,a1
  341.     move.l    #AboutOKText,a2
  342.     bsr    OpenChooseReq
  343.     movem.l    (sp)+,d0-a6
  344.     rts
  345.  
  346. NotEnoughForConvert
  347.     movem.l    d0-a6,-(sp)
  348.     move.l    #NoMemForConvert,a1
  349.     move.l    #AboutOKText,a2
  350.     bsr    OpenChooseReq
  351.     movem.l    (sp)+,d0-a6
  352.     rts
  353.  
  354. ReadError:
  355.     movem.l    d0-a6,-(sp)
  356.     move.l    #ReadErrorText,a1
  357.     move.l    #AboutOKText,a2
  358.     bsr    OpenChooseReq
  359.     movem.l    (sp)+,d0-a6
  360.     rts
  361.  
  362.  
  363. OpenAhiError:
  364.     movem.l    d1-a6,-(sp)
  365.     move.l    #OpenAhiErrorText,a1
  366.     move.l    #OpenAhiErrorAskText,a2
  367.     bsr    OpenChooseReq
  368.     movem.l    (sp)+,d1-a6
  369.     rts
  370.  
  371. OpenAhiError2:
  372.     movem.l    d1-a6,-(sp)
  373.     move.l    #OpenAhiErrorText2,a1
  374.     move.l    #AboutOKText,a2
  375.     bsr    OpenChooseReq
  376.     movem.l    (sp)+,d1-a6
  377.     rts
  378.  
  379.  
  380.  
  381. ReadErrorTEXT:
  382.     dc.b    " Read Error! ",10
  383.     dc.b    0
  384.     even
  385.  
  386. NoMemForConvert:
  387.     dc.b    "Sorry! There is no memory to",10
  388.     dc.b    "convert samples to 16 bit!!!",10
  389.     dc.b    0
  390.     even
  391.  
  392. NoMemoryTEXT:
  393.     dc.b    " Not Enough Memory! ",10
  394.     dc.b    0
  395.     even
  396.  
  397. OpenAhiErrorTEXT:
  398.     dc.b    " Can't open AHI.device !",10
  399.     dc.b    0
  400.     even
  401.  
  402. OpenAhiErrorTEXT2:
  403.     dc.b    " Can't open AHI.device !",10
  404.     dc.b    "       Try again.",10
  405.     dc.b    0
  406.     even
  407.  
  408. OpenAhiErrorASKTEXT:
  409.     dc.b    "_Retry |_Cancel",0
  410.     even
  411.  
  412. AboutOKText:
  413.     dc.b    "_OK",0
  414.     even
  415.  
  416.  
  417.  
  418. ConvertAllTo16BIT:
  419.     movem.l    d0-a6,-(sp)
  420.     cmp.l    #0,Ahi_Sound0
  421.     beq.s    .no16bitmode
  422.  
  423.     move.w    #0,Mode16biten
  424.     move.l    #0,Ahi_Sound0
  425. ;    jsr    FreeSampleBuffer
  426.     move.w    #1,Mode16biten
  427.     move.l    #1,Ahi_Sound0
  428.  
  429.  
  430.     move.l    #255-1,d6
  431.     moveq    #0,d7
  432. .loop
  433.     movem.l    d0-d6/a0-a6,-(sp)
  434.     bsr    ConvertTO16BIT
  435.     movem.l    (sp)+,d0-d6/a0-a6
  436.  
  437.     cmp.w    #-1,d7
  438.     beq.s    NotMem
  439.  
  440.     dbf    d6,.loop
  441.  
  442. .no16bitmode
  443.     movem.l    (sp)+,d0-a6
  444.     rts
  445.  
  446. NotMem:
  447.     jsr    NotEnoughForConvert
  448.  
  449. ;    move.w    #0,Mode16BitEn
  450. ;    move.l    #AHIST_M8S,AHI_Sound0
  451. ;    jsr    ConvertAllTO8bit
  452.  
  453.     movem.l    (sp)+,d0-a6
  454.     rts
  455.  
  456. ConvertTO16BIT:
  457.     lea    SampleType,a6
  458.     tst.b    (a6,d6.w)
  459.     bne.s    .juzjest16bit
  460.     move.b    #1,(a6,d6.w)
  461.     move.l    d6,d7
  462.     lsl.w    #4,d7
  463.     lea    AHI_Samples,a5
  464.     move.l    4(a5,d7.w),d0
  465.     tst.l    d0
  466.     beq.s    .juzjest16bit
  467.  
  468.     movem.l    d1-a6,-(sp)
  469.     move.l    4,a6
  470.     add.l    d0,d0
  471.     addq.l    #8,d0
  472.     move.l    #$10001,d1
  473.     jsr    -198(a6)
  474.     movem.l    (sp)+,d1-a6
  475.     tst.l    d0
  476.     beq    .allocerror
  477.     addq.l    #8,d0
  478.  
  479.     movem.l    d0-a6,-(sp)
  480.     move.l    (a5,d7.w),a2
  481.     move.l    d0,a3
  482.     move.l    4(a5,d7.w),d6
  483. .expandto16
  484.     move.b    (a2)+,(a3)+
  485.     clr.b    (a3)+
  486.     subq.l    #1,d6
  487.     tst.l    d6
  488.     bgt.s    .expandto16
  489.     movem.l    (sp)+,d0-a6
  490.  
  491.     movem.l    d0-a6,-(sp)
  492.     move.l    (a5,d7.w),a1
  493.     move.l    4(a5,d7.w),d0
  494.     subq.l    #8,a1
  495.     addq.l    #8,d0
  496.     move.l    4,a6
  497.     jsr    -210(a6)
  498.     movem.l    (sp)+,d0-a6
  499.  
  500.     move.l    d0,(a5,d7.w)
  501.  
  502. .juzjest16bit
  503.     moveq    #0,d7
  504.     rts
  505.  
  506. .allocerror
  507.     clr.b    (a6,d6.w)
  508.     moveq    #-1,d7
  509.     rts
  510.  
  511.  
  512.  
  513. ; ------------------------- read DBM0
  514. DBM0:    move.l    dosbase,a6
  515.     move.l    ReadName(pc),d1
  516.     move.l    #ModeRead,d2
  517.     jsr    open(a6)
  518.  
  519.     tst.l    d0
  520.     beq.w    RM_ReadError
  521.     move.l    d0,filehandle
  522.  
  523.     clr.w    DBM0_DONE1
  524.     clr.w    DBM0_DONE2
  525.  
  526.     lea    MODBUFFER,a5
  527.     move.l    filehandle,d1
  528.     move.l    a5,d2
  529.     move.l    #8,d3
  530.     jsr    read(a6)
  531.     cmp.l    #-1,d0
  532.     beq.w    RM_ReadError
  533.  
  534. ; ----------- read hunks
  535. .mainloop
  536.     move.l    DosBase,a6
  537.     move.l    filehandle,d1
  538.     move.l    a5,d2
  539.     move.l    #8,d3
  540.     jsr    read(a6)
  541.     cmp.l    #-1,d0
  542.     beq.w    DBM0_ReadError
  543.  
  544.     lea    Headers,a0
  545. .loop
  546.     move.l    (a0)+,d0
  547.     move.l    (a0)+,a1
  548.  
  549.     cmp.l    #-1,d0
  550.     beq.s    .notfound
  551.     cmp.l    (a5),d0
  552.     bne.s    .loop
  553.     addq.w    #1,DBM0_DONE1
  554.     jsr    (a1)
  555.     cmp.w    #0,LoadModError
  556.     bne.s    .done
  557.     cmp.w    #7,DBM0_DONE1
  558.     beq.w    .done
  559.     bra.s    .mainloop
  560.  
  561. .notfound
  562.     move.l    DosBase,a6
  563.     move.l    filehandle,d1
  564.     move.l    a5,d2
  565.     move.l    4(a5),d3
  566.     tst.l    d3
  567.     beq.s    .zero
  568.     jsr    read(a6)
  569.     cmp.l    #-1,d0
  570.     beq.w    DBM0_ReadError
  571. .zero
  572.     addq.w    #1,DBM0_DONE2
  573.     cmp.w    #10,DBM0_DONE2
  574.     beq.s    .done
  575.     bra.w    .mainloop
  576.  
  577. .done
  578.     move.l    DosBase,a6
  579.     move.l    filehandle,d1
  580.     jsr    close(a6)
  581.  
  582.     movem.l    d0-a6,-(sp)
  583.     bsr    ConvertAllTo16BIT
  584. ;    jsr    ChangeMM_MAIN
  585.     movem.l    (sp)+,d0-a6
  586.     rts
  587.  
  588.  
  589. HEADERS:
  590.     dc.b    "NAME"
  591.     dc.l    DBM0_ReadName
  592.  
  593.     dc.b    "INFO"
  594.     dc.l    DBM0_ReadInfo
  595.  
  596.     dc.b    "SONG"
  597.     dc.l    DBM0_ReadSong
  598.  
  599.     dc.b    "INST"
  600.     dc.l    DBM0_ReadInst
  601.  
  602.     dc.b    "PATT"
  603.     dc.l    DBM0_ReadPatt
  604.  
  605.     dc.b    "SMPL"
  606.     dc.l    DBM0_ReadSmpl
  607.  
  608.     dc.b    "VENV"
  609.     dc.l    DBM0_ReadVenv
  610.  
  611.     dc.l    -1
  612.  
  613. DBM0_DONE1:
  614.     dc.w    0
  615. DBM0_DONE2:
  616.     dc.w    0
  617.  
  618. DBM0_ReadError:
  619.     moveq    #-1,d0
  620.     jsr    ReadError
  621.     move.w    #2,LoadModError
  622.     rts
  623.  
  624.  
  625. DBM0_ReadName:
  626.     move.l    filehandle,d1
  627.     move.l    a5,d2
  628.     move.l    4(a5),d3
  629.     jsr    read(a6)
  630.     cmp.l    #-1,d0
  631.     beq.w    DBM0_ReadError
  632.  
  633.     move.l    a5,a6
  634.     lea    ModNameBuffer,a4
  635.     moveq    #42-1,d7
  636. .copyname
  637.     move.b    (a6)+,(a4)+
  638.     dbf    d7,.copyname
  639.     moveq    #0,d0
  640.     rts
  641.  
  642. DBM0_ReadInfo:
  643.     move.l    filehandle,d1
  644.     move.l    a5,d2
  645.     move.l    4(a5),d3
  646.     jsr    read(a6)
  647.     cmp.l    #-1,d0
  648.     beq.w    DBM0_ReadError
  649.  
  650.     move.w    (a5),InsNum
  651.     move.w    2(a5),SmpNum
  652.     move.w    4(a5),SngNum
  653.     move.w    6(a5),PatNum
  654.     subq    #1,InsNum
  655.     subq    #1,SmpNum
  656.     subq    #1,SngNum
  657.     subq    #1,PatNum
  658.     clr.l    AHI_CHAN
  659.     move.w    8(a5),AHI_CHAN+2
  660.     move.w    8(a5),TrackNumber
  661.     moveq    #0,d0
  662.     rts
  663.  
  664.  
  665.  
  666.  
  667. DBM0_ReadSong:
  668.     move.l    DosBase,a6
  669.     move.l    filehandle,d1
  670.     move.l    a5,d2
  671.     move.l    #46,d3
  672.     jsr    read(a6)
  673.     cmp.l    #-1,d0
  674.     beq.w    DBM0_ReadError
  675.  
  676.     move.l    a5,a6
  677.     lea    SongNameBuffer,a4
  678.     moveq    #42-1,d7
  679. .copyname
  680.     move.b    (a6)+,(a4)+
  681.     dbf    d7,.copyname
  682.     moveq    #0,d0
  683.  
  684.     move.l    DosBase,a6
  685.     move.l    filehandle,d1
  686.     move.l    #SongOrders,d2
  687.     moveq    #0,d3
  688.     move.w    44(a5),d3
  689.     subq    #1,d3
  690.     move.w    d3,OrdNum
  691.     addq    #1,d3
  692.     add.w    d3,d3
  693.     jsr    read(a6)
  694.     cmp.l    #-1,d0
  695.     beq.w    DBM0_ReadError
  696.  
  697.     move.w    SngNum,d7
  698.     tst.w    d7
  699.     beq.w    .notmore
  700.     subq    #1,d7
  701.  
  702.  
  703.     lea    SongNameBuffer1,a2
  704.     lea    OrdNum1,a3
  705.     lea    SongOrders1,a4
  706. .more
  707.     move.l    DosBase,a6
  708.     move.l    filehandle,d1
  709.     move.l    a5,d2
  710.     move.l    #46,d3
  711.     jsr    read(a6)
  712.     cmp.l    #-1,d0
  713.     beq.w    DBM0_ReadError
  714.  
  715.     movem.l    d0-a6,-(sp)
  716.     move.l    a5,a6
  717.     lea    (a2),a4
  718.     moveq    #42-1,d6
  719. .copyname2
  720.     move.b    (a6)+,(a4)+
  721.     dbf    d6,.copyname2
  722.     movem.l    (sp)+,d0-a6
  723.  
  724.     move.l    DosBase,a6
  725.     move.l    filehandle,d1
  726.     move.l    a4,d2
  727.     moveq    #0,d3
  728.     move.w    44(a5),d3
  729.     subq    #1,d3
  730.     move.w    d3,(a3)
  731.     addq    #1,d3
  732.     add.w    d3,d3
  733.     jsr    read(a6)
  734.     cmp.l    #-1,d0
  735.     beq.w    DBM0_ReadError
  736.  
  737.     addq    #2,a3
  738.     add.l    #44,a2
  739.     add.l    #1025*2,a4
  740.  
  741.     dbf    d7,.more
  742. .notmore
  743.     moveq    #0,d0
  744.     rts
  745.  
  746.  
  747.  
  748.  
  749.  
  750. DBM0_ReadInst:
  751.     move.w    InsNum,d7
  752.     moveq    #0,d6
  753. .instloop
  754.     addq    #1,d6
  755.  
  756.     move.l    DosBase,a6
  757.     move.l    filehandle,d1
  758.     move.l    a5,d2
  759.     move.l    #50,d3
  760.     jsr    read(a6)
  761.     cmp.l    #-1,d0
  762.     beq.w    DBM0_ReadError
  763.  
  764.     lea    InstrNames,a6
  765.     move.l    d6,d5
  766.     mulu    #30,d5
  767.     add.w    d5,a6
  768.     moveq    #30-1,d4
  769.     lea    (a5),a4
  770. .copyname
  771.     move.b    (a4)+,(a6)+
  772.     dbf    d4,.copyname
  773.  
  774.     lea    Instruments,a6
  775.     move.l    d6,d5
  776.     add.w    d5,d5
  777.     move.w    30(a5),(a6,d5.w)
  778.  
  779.     lea    SamVol,a6
  780.     move.w    32(a5),d4
  781.     move.b    d4,-1(a6,d6.w)
  782.  
  783.     lea    SamFin,a6
  784.     move.l    d6,d5
  785.     lsl.w    #2,d5
  786.     move.l    34(a5),(a6,d5.w)
  787.  
  788.     lea    Ahi_Samples,a6
  789.     move.l    d6,d5
  790.     lsl.w    #4,d5
  791.     move.l    38(a5),8(a6,d5.w)
  792.     move.l    42(a5),12(a6,d5.w)
  793.  
  794.     lea    LoopTab,a6
  795.     move.l    46(a5),d5
  796.     move.b    d5,(a6,d6.w)
  797.  
  798.     dbf    d7,.instloop
  799.     moveq    #0,d0
  800.     rts
  801.  
  802.  
  803.  
  804.  
  805.  
  806.  
  807. DBM0_ReadVenv:
  808.     move.l    DosBase,a6
  809.     move.l    filehandle,d1
  810.     move.l    a5,d2
  811.     move.l    #2,d3
  812.     jsr    read(a6)
  813.     cmp.l    #-1,d0
  814.     beq.w    DBM0_ReadError
  815.  
  816.     move.w    (a5),d7
  817.     beq.s    .exit
  818.     subq    #1,d7
  819. .venvloop
  820.     move.l    DosBase,a6
  821.     move.l    filehandle,d1
  822.     move.l    a5,d2
  823.     move.l    #2,d3
  824.     jsr    read(a6)
  825.     cmp.l    #-1,d0
  826.     beq.w    DBM0_ReadError
  827.  
  828.     lea    VolEnvelope,a0
  829.     moveq    #0,d6
  830.     move.w    (a5),d6
  831.     subq    #1,d6
  832.     mulu    #134,d6
  833.     add.l    d6,a0
  834.     move.l    a0,d2
  835.  
  836.     move.l    DosBase,a6
  837.     move.l    filehandle,d1
  838.     move.l    #134,d3
  839.     jsr    read(a6)
  840.     cmp.l    #-1,d0
  841.     beq.w    DBM0_ReadError
  842.  
  843.     dbf    d7,.venvloop
  844. .exit
  845.     moveq    #0,d0
  846.     rts
  847.  
  848.  
  849.  
  850. DBM0_ReadPatt:
  851.     move.l    4.w,a6
  852.     moveq    #0,d0
  853.     move.w    TrackNumber,d0
  854.     mulu    #8,d0
  855.     mulu    #256,d0
  856.     addq.l    #8,d0
  857.     move.l    #$10001,d1
  858.     jsr    -198(a6)
  859.     tst.l    d0
  860.     beq    DBM0_ReadError
  861.     addq.l    #8,d0
  862.     move.l    d0,PP_ADR
  863.  
  864.  
  865.     lea    PATTLENS,a3
  866.     lea    PATTAdresses,a4
  867.  
  868.     moveq    #0,d5
  869.     move.w    PATNUM,d5
  870. .onepatt
  871.     move.l    DosBase,a6
  872.     move.l    filehandle,d1
  873.     move.l    a5,d2
  874.     move.l    #6,d3
  875.     jsr    read(a6)
  876.     cmp.l    #-1,d0
  877.     beq.w    DBM0_ReadError
  878.  
  879.  
  880.     moveq    #0,d0
  881.     move.w    (a5),d0
  882. ;    addq    #1,d0
  883.     move.w    d0,(a3)+
  884.     moveq    #0,d1
  885.     move.w    TrackNumber,d1
  886.     mulu    #6,d1
  887.     mulu    d0,d1
  888.     move.l    d0,d6
  889.  
  890. ; ----------- alloc do rozpakowanego
  891.     move.l    4,a6
  892.     move.l    d1,d0
  893.     addq.l    #8,d0
  894.     move.l    #$10001,d1
  895.     jsr    -198(a6)
  896.     tst.l    d0
  897.     beq    RM_AllocError
  898.     addq.l    #8,d0
  899.     move.l    d0,(a4)+
  900.  
  901.  
  902.     move.l    DosBase,a6
  903.     move.l    filehandle,d1
  904.     move.l    PP_ADR,d2
  905.     move.l    2(a5),d3
  906.     jsr    read(a6)
  907.     cmp.l    #-1,d0
  908.     beq.w    DBM0_ReadError
  909.  
  910.     movem.l    d0-a6,-(sp)
  911.     move.l    PP_ADR,a0
  912.     move.l    -4(a4),a2
  913.     moveq    #0,d4
  914.     moveq    #0,d5
  915.     move.w    TrackNumber,d4        ; tracks
  916.     move.w    -2(a3),d5        ; rows
  917.     subq    #1,d5
  918.     bsr    DEPACKPATT
  919.     movem.l    (sp)+,d0-a6
  920.  
  921.     dbf    d5,.onepatt
  922.  
  923.  
  924.     move.l    4.w,a6
  925.  
  926.     moveq    #0,d0
  927.     move.w    TrackNumber,d0
  928.     mulu    #8,d0
  929.     mulu    #256,d0
  930.  
  931.     move.l    PP_ADR,a1        ;adres zajetej pamieci
  932.     subq.l    #8,a1
  933.     addq.l    #8,d0
  934.     jsr    -210(a6)
  935.  
  936.  
  937.  
  938.     moveq    #0,d0
  939.     rts
  940.  
  941.  
  942.  
  943.  
  944. DBM0_ReadSmpl:
  945.     move.w    SmpNum,d7
  946.     moveq    #0,d6
  947.  
  948. .readsample
  949.     move.l    DosBase,a6
  950.     move.l    filehandle,d1
  951.     move.l    a5,d2
  952.     move.l    #8,d3
  953.     jsr    read(a6)
  954.     cmp.l    #-1,d0
  955.     beq.w    DBM0_ReadError
  956.  
  957.     addq    #1,d6
  958.     move.l    4(a5),d3
  959.     tst.l    d3
  960.     beq.w    .doloop
  961.  
  962.     move.l    (a5),d0
  963.  
  964.  
  965.     btst    #0,d0
  966.     bne.s    .8bit
  967.  
  968.     add.l    d3,d3
  969.     lea    SampleType,a6
  970.     move.b    #1,(a6,d6.w)
  971.     lea    256(a6),a6
  972.     move.b    #1,(a6,d6.w)
  973.     move.l    #AHIST_M16S,AHI_Sound0
  974.     move.w    #1,Mode16BitEn
  975. .8bit
  976.  
  977.  
  978.     move.l    d3,d0
  979.     addq.l    #8,d0
  980.     move.l    #$10001,d1
  981.     move.l    4,a6
  982.     jsr    -198(a6)
  983.     tst.l    d0
  984.     beq    RM_AllocErrorDBM0SAM
  985.     addq.l    #8,d0
  986.  
  987.     move.l    d6,d5
  988.     lsl.w    #4,d5
  989.  
  990.     lea    Ahi_samples,a6
  991.     tst.l    4(a5)
  992.     beq.s    .qw
  993.     move.l    d0,(a6,d5.w)
  994. .qw
  995.     move.l    4(a5),4(a6,d5.w)
  996. **
  997.  
  998.     move.l    DosBase,a6
  999.     move.l    filehandle,d1
  1000.     move.l    d0,d2
  1001.     jsr    read(a6)
  1002.     cmp.l    #-1,d0
  1003.     beq.w    DBM0_ReadError
  1004. .doloop
  1005.     dbf    d7,.readsample
  1006.  
  1007.  
  1008.  
  1009.     moveq    #0,d0
  1010.     rts
  1011.  
  1012.  
  1013.  
  1014.  
  1015. DEPACKPATT:
  1016.     mulu    #6,d4
  1017.     moveq    #0,d2
  1018.     moveq    #0,d3
  1019. .depackloop
  1020.     moveq    #0,d0
  1021.     move.b    (a0)+,d0
  1022.     tst.b    d0
  1023.     beq.w    .NextPos
  1024.  
  1025.     subq    #1,d0
  1026.     mulu    #6,d0
  1027.     add.l    d3,d0
  1028.  
  1029.     moveq    #0,d1
  1030.     move.b    (a0)+,d1
  1031.  
  1032.     btst    #0,d1
  1033.     beq.s    .notakenuta
  1034.     move.b    (a0)+,0(a2,d0.l)
  1035. .notakenuta
  1036.     btst    #1,d1
  1037.     beq.s    .notakenum
  1038.     move.b    (a0)+,1(a2,d0.l)
  1039. .notakenum
  1040.     btst    #2,d1
  1041.     beq.s    .notakeeffcom1
  1042.     move.b    (a0)+,2(a2,d0.l)
  1043. .notakeeffcom1
  1044.     btst    #3,d1
  1045.     beq.s    .notakeeffpar1
  1046.     move.b    (a0)+,3(a2,d0.l)
  1047. .notakeeffpar1
  1048.     btst    #4,d1
  1049.     beq.s    .notakeeffcom2
  1050.     move.b    (a0)+,4(a2,d0.l)
  1051. .notakeeffcom2
  1052.     btst    #5,d1
  1053.     beq.s    .notakeeffpar2
  1054.     move.b    (a0)+,5(a2,d0.l)
  1055. .notakeeffpar2
  1056.     bra.s    .depackloop
  1057.  
  1058. .NextPos:
  1059.     addq    #1,d2
  1060.     move.l    d2,d3
  1061.     mulu    d4,d3
  1062.  
  1063.     cmp.w    d2,d5
  1064.     bge.s    .depackloop
  1065.     rts
  1066.  
  1067.  
  1068.  
  1069. ; -------------------------------------------------------
  1070.  
  1071. RM_ReadError:
  1072.     moveq    #0,d7
  1073.     move.w    #1,LoadModError
  1074.     jsr    ReadError
  1075.     rts
  1076.  
  1077. RM_AllocErrorDBM0SAM
  1078.     moveq    #0,d7
  1079.     move.w    #1,LoadModError
  1080.     jsr    NotEnoughMemoryError
  1081.     move.l    #AHIST_M8S,AHI_Sound0
  1082.     move.w    #0,Mode16BitEn
  1083.     rts
  1084.  
  1085. RM_AllocError:
  1086.     moveq    #0,d7
  1087.     move.w    #1,LoadModError
  1088.     jsr    NotEnoughMemoryError
  1089.     rts
  1090.  
  1091. RM_AllocSamError:
  1092.     clr.l    (a4)
  1093.     clr.l    4(a4)
  1094.     clr.l    8(a4)
  1095.     clr.l    12(a4)
  1096.     moveq    #0,d7
  1097.     move.w    #1,LoadModError
  1098.     jsr    NotEnoughMemoryError
  1099.     rts
  1100.  
  1101. ; -------------------------------------------------------
  1102.  
  1103.  
  1104. ;    Section    code,code_p
  1105.  
  1106. ChanArea    equ    108
  1107.  
  1108.  
  1109. ;SamBuffAdr:    equ    0    ; 4
  1110. ;SamRep1:    equ    4    ; 4
  1111. ;SamRep2:    equ    8    ; 4
  1112. ;ChangeAdr:    equ    12    ; 1
  1113. ;MixDon:    equ    13    ; 1
  1114.  
  1115.  
  1116. VolA:        equ    0    ; 2
  1117. SlideVolOldA    equ    2    ; 1
  1118. OldGlobalVolA    equ    3    ; 1
  1119.  
  1120. VolB:        equ    4    ; 2
  1121. SlideVolOldB    equ    6    ; 1
  1122. OldGlobalVolB    equ    7    ; 1
  1123.  
  1124. OLDVolA:    equ    8    ; 2
  1125. OLDVolB:    equ    10    ; 2
  1126.  
  1127. SlideSamOffset    equ    12    ; 2
  1128. OldSlideOffsetA    equ    14    ; 1
  1129. OldSlideOffsetB    equ    15    ; 1
  1130.  
  1131. MainVol:    equ    16    ; 2
  1132.  
  1133. ReplaceEnable    equ    18    ; 1
  1134. OFFenable    equ    19    ; 1
  1135. SamOffsetA    equ    20    ; 1
  1136. SamOffsetB    equ    21    ; 1
  1137. RetraceCntA    equ    22    ; 1
  1138. RetraceCntB    equ    23    ; 1
  1139. OldInstrNumA:    equ    24    ; 1
  1140. OldInstrNumB:    equ    25    ; 1
  1141.  
  1142. OrgPeriod    equ    26    ; 2
  1143. MainPeriod:    equ    28    ; 2
  1144. OldPeriod:    equ    30    ; 2
  1145.  
  1146. PlayPointer    equ    32    ; 1
  1147. Oldd0        equ    34    ; 2
  1148. Oldd1        equ    36    ; 2
  1149. Oldd2        equ    38    ; 2
  1150. Oldd3        equ    40    ; 2
  1151. Oldd4        equ    42    ; 2
  1152. Oldd5        equ    44    ; 2
  1153. Oldd6        equ    46    ; 2
  1154. loopsdataschanA    equ    48    ; 4
  1155. loopsdataschanB    equ    52    ; 4
  1156. BACKWDenable:    equ    56    ; 1
  1157. EqNewSamA    equ    57    ; 1
  1158. EqNewSamB    equ    58    ; 1
  1159. MainDTALEN:    equ    60    ; 2
  1160. PortUpOldValA    equ    62    ; 1
  1161. PortUpOldValB    equ    63    ; 1
  1162. PortDownOldValA    equ    64    ; 1
  1163. PortDownOldValB    equ    65    ; 1
  1164. VibratoDatasA    equ    66    ; 4
  1165. VibratoDatasB    equ    70    ; 4
  1166. GlissandoDatasA    equ    74    ; 6
  1167. GlissandoDatasB    equ    80    ; 6
  1168.  
  1169. NoteDelayPeriodA    equ    86    ; 2
  1170. NoteDelayInstrNumA    equ    88    ; 2
  1171. NoteDelayPeriodB    equ    90    ; 2
  1172. NoteDelayInstrNumB    equ    92    ; 2
  1173.  
  1174. PanPos        equ    94    ; 4
  1175. OnOffChanA    equ    98    ; 1
  1176. OnOffChanB    equ    99    ; 1
  1177. OrgPeriodARP    equ    100    ; 2
  1178. NoteCount    equ    102    ; 2
  1179. VolEnvTime    equ    104    ; 2
  1180. VolEnvOff    equ    106    ; 1
  1181. VolEnvMode    equ    107    ; 1
  1182.  
  1183.  
  1184. ;----------------------------------------------
  1185.  
  1186.  
  1187. ahibase:    dc.l    0
  1188. ahi_ctrl:    dc.l    0
  1189.  
  1190. ahi_ctrltags:
  1191.         dc.l    AHIC_Play,1
  1192.         dc.l    TAG_DONE
  1193. ahi_tags
  1194.         dc.l    AHIA_MixFreq
  1195. ahi_freq
  1196.         dc.l    32000
  1197.         dc.l    AHIA_Channels
  1198. ahi_chan:
  1199.         dc.l    8
  1200.         dc.l    AHIA_Sounds,1
  1201.         dc.l    AHIA_AudioID
  1202. ahi_audioid
  1203.         dc.l    $00020004    ; 2 pan, 4 stereo, 6 mono   8 8bit pan
  1204.         dc.l    AHIA_SoundFunc,SoundFunc
  1205.         dc.l    AHIA_PlayerFunc,PlayerFunc
  1206.         dc.l    AHIA_PlayerFreq,50<<16
  1207.         dc.l    AHIA_MinPlayerFreq,[32*2/5]<<16
  1208.         dc.l    AHIA_MaxPlayerFreq,[255*2/5]<<16
  1209.         dc.l    TAG_DONE
  1210.  
  1211. ahi_sound0:
  1212.         dc.l    AHIST_M8S
  1213. ahi_sta    dc.l    0            ; start
  1214. ahi_len    dc.l    -1                ; len
  1215.  
  1216. AHI_VOLBOOST:
  1217.         dc.l    Ahiet_MasterVolume
  1218. AHIBoost
  1219.         dc.l    $10000
  1220.         dc.l    TAG_DONE
  1221.  
  1222.  
  1223. PlayerFunc:
  1224.         blk.b    MLN_SIZE
  1225.         dc.l    mmusic
  1226.         dc.l    0
  1227.         dc.l    0
  1228.  
  1229. SoundFunc:
  1230.         blk.b    MLN_SIZE
  1231.         dc.l    soundfunc2
  1232.         dc.l    0
  1233.         dc.l    0
  1234.  
  1235. RecordFunc:
  1236.         blk.b    MLN_SIZE
  1237.         dc.l    RecordFuncS
  1238.         dc.l    0
  1239.         dc.l    0
  1240.  
  1241.     STRUCTURE RecordData,0
  1242.     BYTE    signal
  1243.     BYTE    pad
  1244.     ULONG    signalflag
  1245.     APTR    AHIbuffer1
  1246.     APTR    AHIbuffer2
  1247.     ULONG    bufferlen
  1248.     ULONG    AHIcount
  1249.     ULONG    offs
  1250.     APTR    AHItask
  1251.     LABEL    RecordData_SIZEOF
  1252.  
  1253.  
  1254. *    A0 - (struct Hook *)
  1255. *    A2 - (struct AHIAudioCtrl *)
  1256. *    A1 - (struct AHIRecordMessage *)
  1257. *The message (AHIRecordMessage) is filled as follows:
  1258. *    ahirm_Type - Always AHIST_S16S at the moment, but you *must*
  1259. *        check this, since it may change in the future!
  1260. *    ahirm_Buffer - Pointer to the samples. The buffer is valid
  1261. *        until next time the Hook is called.
  1262. *    ahirm_Length - Number of sample FRAMES in buffer.
  1263. *        To get the size in bytes, multiply by 4 if ahiim_Type is
  1264. *        AHIST_S16S.
  1265.  
  1266.  
  1267. RecordFuncS:
  1268.     movem.l    d2-d7/a2-a6,-(sp)
  1269.  
  1270.  
  1271. ;    lea    RecordStruct,a1
  1272.  
  1273.     move.l    a2,-(sp)
  1274. * Check if we know the sample format
  1275.     cmp.l    #AHIST_S16S,ahirm_Type(a1)
  1276.     bne.b    .X5$                ; Unknown format!
  1277.  
  1278.     move.l    h_Data(a0),a0            ; Get pointer to RecordData structure
  1279.     move.l    ahirm_Length(a1),d0        ; Sample frames in buffer
  1280.     move.l    ahirm_Buffer(a1),a1        ; The samples themselves
  1281.     move.l    AHIbuffer1(a0),a2            ; Our own buffer
  1282.     add.l    offs(a0),a2
  1283.  
  1284.  
  1285.     cmp.l    AHIcount(a0),d0            ; Will all samples fit in our buffer?
  1286.     bls.b    .X3$                ; Branch if yes.
  1287.  
  1288. ; Fill buffer until it's full
  1289.     move.l    AHIcount(a0),d1            ; Number of samples left
  1290.     beq.b    .X2$                ; Buffer already full? Skip 1st pass.
  1291.     sub.l    d1,d0                ; d0 = # of samples in second pass.
  1292. .X1$
  1293.     move.l    (a1)+,(a2)+            ; Move both left & right word
  1294.     subq.l    #1,d1                ; We can't use dbf/dbra here.
  1295.     bne.b    .X1$
  1296. .X2$
  1297.     move.l    AHIbuffer2(a0),a2            ; Swap pointers to 1st and 2nd buffer
  1298.     move.l    AHIbuffer1(a0),AHIbuffer2(a0)
  1299.     move.l    a2,AHIbuffer1(a0)
  1300.     move.l    bufferlen(a0),AHIcount(a0)        ; Init count
  1301.     clr.l    offs(a0)
  1302.     movem.l    d0/a0-a1/a6,-(sp)
  1303.     move.l    4.w,a6
  1304.     move.l    AHItask(a0),a1
  1305.     move.l    signalflag(a0),d0
  1306.     jsr    _LVOSignal(a6)            ; Tell main task buffer is ready
  1307.     movem.l    (sp)+,d0/a0-a1/a6
  1308.  
  1309. * Now fill the rest of the new buffer and exit.
  1310.  
  1311. .X3$
  1312.     sub.l    d0,AHIcount(a0)            ; Update count
  1313.     move.l    d0,d1
  1314.     lsl.l    #2,d1
  1315.     add.l    d1,offs(a0)
  1316. .X4$
  1317.     move.l    (a1)+,(a2)+            ; Move both left & right word
  1318.     subq.l    #1,d0
  1319.     bne.b    .X4$
  1320. .X5$
  1321.     move.l    (sp)+,a2
  1322.     moveq    #0,d0
  1323.  
  1324.  
  1325.     movem.l    (sp)+,d2-d7/a2-a6
  1326.     rts
  1327.  
  1328.  
  1329. ;in:
  1330. * a0        struct Hook *                  
  1331. * a1        struct AHISoundMessage *         
  1332. * a2        struct AHIAudioCtrl *           
  1333.  
  1334.  
  1335. soundfunc2:
  1336.     movem.l    d2-d4/a6,-(sp)
  1337.     moveq    #0,d0
  1338.     move.w    ahism_Channel(a1),d0
  1339.     lea    ahi_channels,a0
  1340.     lsl.w    #2,d0
  1341.     move.w    2(a0,d0.w),d1
  1342.     and.w    #$00ff,d1
  1343.     move.w    (a0,d0.w),d7
  1344.     lsl.l    #4,d1
  1345.  
  1346.  
  1347.     lea    ahi_samples,a0
  1348.     move.l    (a0,d1.w),d2            ;sample start
  1349.     cmp.l    #0,Ahi_Sound0
  1350.     beq.s    .no16bit_1
  1351.     lsr.l    #1,d2
  1352. .no16bit_1
  1353.  
  1354.     tst.w    NoLoopEnable
  1355.     beq.s    .noloop1
  1356.     moveq    #0,d3
  1357.     bra.s    .noloop2
  1358. .noloop1
  1359.  
  1360.     add.l    8(a0,d7.w),d2            ;repeat start
  1361.     move.l    12(a0,d7.w),d3            ;repeat length
  1362.  
  1363. .noloop2
  1364.  
  1365.     moveq    #0,d4                ;NOTE: AHISF_IMM *NOT* SET!!
  1366. ;----------------------------
  1367.     lea    LoopTab,a0
  1368.     move.w    d7,d1
  1369.     moveq    #0,d7
  1370.     lsr.w    #4,d1
  1371.     btst    #1,(a0,d1.w)
  1372.     beq.s    .nopingpong
  1373.     moveq    #0,d4
  1374.     lea    ahi_channels,a0
  1375.     move.b    2(a0,d0.w),d4
  1376.     subq.w    #1,d4
  1377.     muls    #-1,d4
  1378.     move.b    d4,2(a0,d0.w)
  1379.     moveq    #1,d7
  1380. .nopingpong
  1381. ;----------------------------
  1382.  
  1383.     lsr.l    #2,d0                ; chnnum
  1384.     moveq    #0,d1                ;sample bank
  1385.  
  1386.     tst.l    d3
  1387.     beq.w    .length_0
  1388.  
  1389.     tst.w    d7                ; gdy ping pong loop
  1390.     bne.w    .pingpongproc
  1391.  
  1392.     cmp.w    #32,d0                ; tylko dla 32 kanalow
  1393.     bgt.w    .length_ok
  1394.     cmp.l    #512,d3
  1395.     bge.w    .length_ok
  1396.  
  1397.     cmp.l    #0,Ahi_Sound0            ; gdy 16 bit to olewa i skacze do proc2
  1398.     bne.s    .16bitproc
  1399.  
  1400. .8bitproc:
  1401.     movem.l    d0-d1/d4-a2,-(sp)
  1402.  
  1403.     lea    SamBuff,a0
  1404.     mulu    #1024+[16],d0
  1405.     add.w    d0,a0
  1406.  
  1407.     cmp.l    (a0),d2
  1408.     bne.s    .notakedata
  1409.     cmp.l    4(a0),d3
  1410.     beq.s    .takedata
  1411. .notakedata
  1412.     move.l    d2,(a0)
  1413.     move.l    d3,4(a0)
  1414.  
  1415.     add.l    #16,a0
  1416.     move.l    d2,a1
  1417.     move.l    a0,d2
  1418.     move.l    d2,-8(a0)
  1419.  
  1420.     move.l    d3,d7
  1421.     move.l    #1024,d6
  1422.     divu    d7,d6
  1423.     and.l    #$ffff,d6
  1424.     move.l    d7,d3
  1425.     mulu    d6,d3
  1426.     move.l    d3,-4(a0)
  1427.  
  1428.     subq    #1,d6
  1429.     subq    #1,d7
  1430.     move.l    a1,d4
  1431.     move.l    d7,d5
  1432. .makebuffloopM
  1433.     move.l    d4,a1
  1434.     move.l    d5,d7
  1435. .makebuff
  1436.     move.b    (a1)+,(a0)+
  1437.     dbf    d7,.makebuff
  1438.     dbf    d6,.makebuffloopM
  1439.     bra.s    .makebuffdone
  1440. .takedata
  1441.     move.l    8(a0),d2
  1442.     move.l    12(a0),d3
  1443. .makebuffdone
  1444.     movem.l    (sp)+,d0-d1/d4-a2
  1445.     bra.w    .length_ok
  1446.  
  1447.  
  1448.  
  1449.  
  1450.  
  1451. .16bitproc:
  1452.     cmp.l    #512/2,d3
  1453.     bge.w    .length_ok
  1454.  
  1455.     movem.l    d0-d1/d4-a2,-(sp)
  1456.  
  1457.     lea    SamBuff,a0
  1458.     mulu    #1024+[16],d0
  1459.     add.w    d0,a0
  1460.  
  1461.     cmp.l    (a0),d2
  1462.     bne.s    .notakedata16
  1463.     cmp.l    4(a0),d3
  1464.     beq.s    .takedata16
  1465. .notakedata16
  1466.     move.l    d2,(a0)
  1467.     move.l    d3,4(a0)
  1468.  
  1469.     add.l    #16,a0
  1470.     move.l    d2,a1
  1471.     add.l    d2,a1
  1472.     move.l    a0,d2
  1473.     move.l    d2,-8(a0)
  1474.  
  1475.     move.l    d3,d7
  1476.     move.l    #1024/2,d6
  1477.     divu    d7,d6
  1478.     and.l    #$ffff,d6
  1479.     move.l    d7,d3
  1480.     mulu    d6,d3
  1481.     move.l    d3,-4(a0)
  1482.  
  1483.     subq    #1,d6
  1484.     subq    #1,d7
  1485.     move.l    a1,d4
  1486.     move.l    d7,d5
  1487. .makebuffloopM16
  1488.     move.l    d4,a1
  1489.     move.l    d5,d7
  1490. .makebuff16
  1491.     move.w    (a1)+,(a0)+
  1492.     dbf    d7,.makebuff16
  1493.     dbf    d6,.makebuffloopM16
  1494.     bra.s    .makebuffdone16
  1495. .takedata16
  1496.     move.l    8(a0),d2
  1497.     move.l    12(a0),d3
  1498. .makebuffdone16
  1499.     cmp.l    #0,Ahi_Sound0
  1500.     beq.s    .no16bit_2
  1501.     lsr.l    #1,d2
  1502. .no16bit_2
  1503.     movem.l    (sp)+,d0-d1/d4-a2
  1504.     bra.w    .length_ok
  1505.  
  1506.  
  1507.  
  1508.  
  1509.  
  1510. .pingpongproc:
  1511.     cmp.w    #32,d0                ; tylko dla 32 kanalow
  1512.     bgt.w    .length_ok
  1513.     cmp.l    #512/2,d3            ; ping pong musi miec parzyste
  1514.     bge.w    .length_ok
  1515.  
  1516.  
  1517.     cmp.l    #0,Ahi_Sound0            ; gdy 16 bit to olewa i skacze do proc2
  1518.     bne.w    .16bitprocpp
  1519.  
  1520.  
  1521. .8bitproc_pp:
  1522.     movem.l    d0-d1/d4-a2,-(sp)
  1523.  
  1524.     lea    SamBuff,a0
  1525.     mulu    #1024+[16],d0
  1526.     add.w    d0,a0
  1527.  
  1528.     cmp.l    (a0),d2
  1529.     bne.s    .notakedata_pp
  1530.     cmp.l    4(a0),d3
  1531.     beq.s    .takedata_pp
  1532. .notakedata_pp
  1533.     move.l    d2,(a0)
  1534.     move.l    d3,4(a0)
  1535.  
  1536.     add.l    #16,a0
  1537.     move.l    d2,a1
  1538.     move.l    a0,d2
  1539.     move.l    d2,-8(a0)
  1540.  
  1541.     move.l    d3,d7
  1542.     move.l    #1024,d6
  1543.     divu    d7,d6
  1544.     and.l    #$ffff,d6
  1545.     move.l    d7,d3
  1546.     mulu    d6,d3
  1547.     move.l    d3,-4(a0)
  1548.  
  1549.     lsr.l    #1,d6        ; dziele przez dwa ilosc petli bo jest ping pong
  1550.  
  1551.     subq    #1,d6
  1552.     subq    #1,d7
  1553.     move.l    a1,d4
  1554.     move.l    d7,d5
  1555. .makebuffloopM_pp
  1556.     move.l    d4,a1
  1557.     move.l    d5,d7
  1558. .makebuff_pp
  1559.     move.b    (a1)+,(a0)+
  1560.     dbf    d7,.makebuff_pp
  1561.  
  1562.  
  1563. ;    move.l    d4,a1
  1564.     move.l    d5,d7
  1565. .makebuff_pp2
  1566.     move.b    -(a1),(a0)+
  1567.     dbf    d7,.makebuff_pp2
  1568.  
  1569.  
  1570.     dbf    d6,.makebuffloopM_pp
  1571.     bra.s    .makebuffdone_pp
  1572. .takedata_pp
  1573.     move.l    8(a0),d2
  1574.     move.l    12(a0),d3
  1575. .makebuffdone_pp
  1576.     movem.l    (sp)+,d0-d1/d4-a2
  1577.  
  1578.     moveq    #0,d4
  1579.     bra.w    .length_ok
  1580.  
  1581.  
  1582.  
  1583.  
  1584.  
  1585.  
  1586.  
  1587. .16bitprocpp:
  1588.     cmp.l    #512/2/2,d3
  1589.     bge.w    .length_ok
  1590.  
  1591.     movem.l    d0-d1/d4-a2,-(sp)
  1592.  
  1593.     lea    SamBuff,a0
  1594.     mulu    #1024+[16],d0
  1595.     add.w    d0,a0
  1596.  
  1597.     cmp.l    (a0),d2
  1598.     bne.s    .notakedata16pp
  1599.     cmp.l    4(a0),d3
  1600.     beq.s    .takedata16pp
  1601. .notakedata16pp
  1602.     move.l    d2,(a0)
  1603.     move.l    d3,4(a0)
  1604.  
  1605.     add.l    #16,a0
  1606.     move.l    d2,a1
  1607.     add.l    d2,a1
  1608.     move.l    a0,d2
  1609.     move.l    d2,-8(a0)
  1610.  
  1611.     move.l    d3,d7
  1612.     move.l    #1024/2,d6
  1613.     divu    d7,d6
  1614.     and.l    #$ffff,d6
  1615.     move.l    d7,d3
  1616.     mulu    d6,d3
  1617.     move.l    d3,-4(a0)
  1618.  
  1619.     lsr.l    #1,d6        ; dziele przez dwa ilosc petli bo jest ping pong
  1620.  
  1621.     subq    #1,d6
  1622.     subq    #1,d7
  1623.     move.l    a1,d4
  1624.     move.l    d7,d5
  1625. .makebuffloopM16pp
  1626.  
  1627.  
  1628.     move.l    d4,a1
  1629.     move.l    d5,d7
  1630. .makebuff16pp
  1631.     move.w    (a1)+,(a0)+
  1632.     dbf    d7,.makebuff16pp
  1633.  
  1634. ;    move.l    d4,a1
  1635.     move.l    d5,d7
  1636. .makebuff16pp2
  1637.     move.w    -(a1),(a0)+
  1638.     dbf    d7,.makebuff16pp2
  1639.  
  1640.  
  1641.     dbf    d6,.makebuffloopM16pp
  1642.     bra.s    .makebuffdone16pp
  1643. .takedata16pp
  1644.     move.l    8(a0),d2
  1645.     move.l    12(a0),d3
  1646. .makebuffdone16pp
  1647.     cmp.l    #0,Ahi_Sound0
  1648.     beq.s    .no16bit_2pp
  1649.     lsr.l    #1,d2
  1650. .no16bit_2pp
  1651.     movem.l    (sp)+,d0-d1/d4-a2
  1652.  
  1653.     moveq    #0,d4
  1654.     bra.w    .length_ok
  1655.  
  1656.  
  1657.  
  1658.  
  1659.  
  1660. .length_0
  1661.     moveq    #AHI_NOSOUND,d1
  1662. .length_ok
  1663.  
  1664.     lea    SampleOffsets,a6
  1665.  
  1666.     cmp.l    #AHI_NOSOUND,d1
  1667.     bne.s    .nozero
  1668.     cmp.l    (a6,d0.w*4),d2
  1669.     beq.s    .nozero
  1670.  
  1671. ; --------------------------------------- ;
  1672.     lea    SampleOffsetsFT,a6
  1673.     tst.b    (a6,d0.w)
  1674.     beq.s    .okft1
  1675.     clr.b    (a6,d0.w)
  1676.     bra.s    .nozero
  1677. .okft1
  1678. ; ^-------------------------------------- ;
  1679.  
  1680.     lea    SampleOffsets,a6
  1681.     move.l    #0,(a6,d0.w*4)            ;start
  1682. .nozero
  1683.  
  1684.     cmp.l    #0,(a6,d0.w*4)    
  1685.     beq.s    .zero
  1686.  
  1687.     lea    SampleOffsetsFT,a6
  1688.     tst.b    (a6,d0.w)
  1689.     beq.s    .okft2
  1690.     clr.b    (a6,d0.w)
  1691.     bra.s    .zero
  1692. .okft2
  1693. ; ^-------------------------------------- ;
  1694.     lea    SampleOffsets,a6
  1695.     move.l    d2,(a6,d0.w*4)            ;start
  1696. .zero
  1697.  
  1698.  
  1699.     tst.b    d4
  1700.     beq.s    .nopingpong2
  1701.  
  1702.     subq.l    #1,d3
  1703.     add.l    d3,d2
  1704.     subq.l    #1,d2
  1705.     not.l    d3
  1706.     bra.s    .yapingpong
  1707. .nopingpong2
  1708.     tst.w    d7
  1709.     beq.s    .yapingpong
  1710.     cmp.l    #0,(a6,d0.w*4)    
  1711.     beq.s    .yapingpong
  1712.     add.l    d3,(a6,d0.w*4)            ;start
  1713. .yapingpong
  1714.     moveq    #0,d4                ;NOTE: AHISF_IMM *NOT* SET!!
  1715.     move.l    ahibase(pc),a6
  1716.     jsr    _LVOAHI_SetSound(a6)
  1717.  
  1718.     movem.l    (sp)+,d2-d4/a6
  1719. .exit    rts
  1720.  
  1721.  
  1722. lastinstrnum:    dc.w    0
  1723.  
  1724. mmusic:
  1725.     movem.l    d0-a6,-(sp)
  1726.  
  1727.     jsr    db_music
  1728.  
  1729. ;       cmp.w    #1,MIXITENABLE
  1730. ;    bne.s    .ominit
  1731. ;    moveq    #0,d0
  1732. ;    move.w    EndSongPos,d0
  1733. ;    cmp.w    SOngPos,d0
  1734. ;    bne.s    .ominit
  1735. ;
  1736. ;
  1737. ;    moveq    #0,d0
  1738. ;    move.w    SongPos,d0
  1739. ;    add.w    d0,d0
  1740. ;    lea    SongOrders,a0
  1741. ;    move.w    (a0,d0.w),d0
  1742. ;    add.w    d0,d0
  1743. ;    lea    PattLens,a0
  1744. ;    move.w    (a0,d0.w),d0
  1745. ;    subq    #1,d0
  1746. ;
  1747. ;    moveq    #0,d1
  1748. ;    move.w    PattPos,d1
  1749. ;    cmp.w    d0,d1
  1750. ;    bne.s    .ominit
  1751. ;    move.w    #1,StopITNOW
  1752. ;.ominit
  1753.     tst.w    StopEnable
  1754.     beq.s    No_clr_volumes
  1755.     bsr    stop_play
  1756. No_clr_volumes
  1757.     movem.l    (sp)+,d0-a6
  1758.     rts
  1759.  
  1760. clr_volumes:
  1761.     moveq    #0,d0
  1762.     moveq    #0,d1
  1763.     move.w    TrackNumber,d7
  1764.     subq    #1,d7
  1765. init_vols
  1766.     movem.l    d0-a6,-(sp)
  1767.     jsr    ahi_volume
  1768.     movem.l    (sp)+,d0-a6
  1769.     addq    #1,d0
  1770.     dbf    d7,init_vols
  1771.     rts
  1772.  
  1773. stop_play:
  1774.     clr.w    StopEnable
  1775.     moveq    #0,d0
  1776.     moveq    #0,d1
  1777.     move.w    TrackNumber,d7
  1778.     subq    #1,d7
  1779. clr_vols
  1780.     movem.l    d0-a6,-(sp)
  1781.     moveq    #AHISF_IMM,d4
  1782.     moveq    #AHI_NOSOUND,d1
  1783.     move.l    ahibase,a6
  1784.     move.l    ahi_ctrl,a2
  1785.     jsr    _LVOAHI_SetSound(a6)
  1786.     movem.l    (sp)+,d0-a6
  1787.     addq    #1,d0
  1788.     dbf    d7,clr_vols
  1789.     rts
  1790.  
  1791.  
  1792. FreeShortSamBuff:
  1793.     movem.l    d0-a6,-(sp)
  1794.     lea    SamBuff,a0
  1795.     moveq    #32-1,d7
  1796. .freeshortsambuffloop
  1797.     clr.l    (a0)
  1798.     clr.l    4(a0)
  1799.     add.l    #1024+16,a0
  1800.     dbf    d7,.freeshortsambuffloop
  1801.     movem.l    (sp)+,d0-a6
  1802.     rts
  1803.  
  1804.  
  1805. ahi_init:
  1806. .retry    jsr    ahi_initmain
  1807.     tst.l    d0
  1808.     beq.s    .ok
  1809.     jsr    OpenAhiError2
  1810.     bra    .retry
  1811. .ok    rts
  1812.  
  1813.  
  1814. ahi_initstart:
  1815.     jsr    ahi_initmain
  1816.     rts
  1817.  
  1818. ahi_initmain:
  1819.     OPENAHI    1
  1820.     move.l    d0,ahibase
  1821.     beq.w    ahi_eror_at_start
  1822.  
  1823.     move.l    d0,a6
  1824.     lea    ahi_tags(pc),a1
  1825.     jsr    _LVOAHI_AllocAudioA(a6)
  1826.     move.l    d0,ahi_ctrl
  1827.     beq.w    ahi_eror
  1828.  
  1829.     move.l    d0,a2
  1830.     moveq    #0,d0                ;Load module as one sound!
  1831.     moveq    #AHIST_SAMPLE,d1
  1832.     lea    ahi_sound0(pc),a0
  1833.     jsr    _LVOAHI_LoadSound(a6)
  1834.     tst.l    d0
  1835.     bne.w    ahi_eror_allocaudio_ok
  1836.  
  1837.     lea    ahi_ctrltags(pc),a1
  1838.     jsr    _LVOAHI_ControlAudioA(a6)
  1839.     tst.l    d0
  1840.     bne.w    ahi_eror_allocaudio_ok
  1841.  
  1842.     move.w    CiaTempo,d7
  1843.     and.l    #$ffff,d7
  1844.     lsl.w    #1,d7
  1845.     divu    #5,d7
  1846.     and.l    #$ffff,d7
  1847.     swap    d7
  1848.     move.l    d7,afreq
  1849.  
  1850.     move.l    ahibase(pc),a6
  1851.     lea    atags(pc),a1
  1852.     move.l    ahi_ctrl(pc),a2
  1853.     jsr    _LVOAHI_ControlAudioA(a6)
  1854.  
  1855.     move.l    ahibase,a6
  1856.     move.l    #AHI_VOLBOOST,a0
  1857.     move.l    ahi_ctrl,a2
  1858.     jsr    _LVOAHI_Seteffect(a6)
  1859.  
  1860.     moveq    #0,d0
  1861.     rts
  1862.  
  1863. ahi_eror_at_start:
  1864.     moveq    #-1,d0
  1865.     rts
  1866.  
  1867. ahi_eror:
  1868.     CLOSEAHI
  1869.     moveq    #-1,d0
  1870.     rts
  1871.  
  1872.  
  1873. ahi_eror_allocaudio_ok:
  1874.     bsr    ahi_end
  1875.     moveq    #-1,d0
  1876.     rts
  1877.  
  1878. ahi_end:
  1879.     move.l    ahibase(pc),d0
  1880.     beq.b    .exit
  1881.     move.l    d0,a6
  1882.     move.l    ahi_ctrl(pc),a2
  1883.     jsr    _LVOAHI_FreeAudio(a6)
  1884.  
  1885.     CLOSEAHI
  1886. .exit
  1887.     rts
  1888.  
  1889.  
  1890. db_init:
  1891.     move.w    GeneralTempo,CiaTempo
  1892.     moveq    #0,d0
  1893.     move.w    GeneralSpeed,d0
  1894.     move.b    d0,Orgtemp
  1895.  
  1896.     move.l    4.w,a6    
  1897.     move.w    296(a6),d0    
  1898.  
  1899. MC68000:
  1900.     btst    #0,d0
  1901.     beq.s    MC68010
  1902.     move.b    #1,OldCPU
  1903. MC68010:
  1904.     btst    #1,d0
  1905.     beq.s    MC68020
  1906.     clr.b    OldCPU
  1907. MC68020:
  1908.     btst    #2,d0
  1909.     beq.s    MC68030
  1910.     clr.b    OldCPU
  1911. MC68030:
  1912.     btst    #3,d0
  1913.     beq.s    MC68040
  1914.     clr.b    OldCPU
  1915. MC68040:
  1916.     clr.w    SongPos
  1917.     clr.w    PattPos
  1918.     clr.b    count
  1919.  
  1920.     bset    #1,$bfe001
  1921.     move.b    Orgtemp,count
  1922.     rts
  1923.  
  1924.  
  1925. SongPos:    dc.w    0
  1926. PattPos:    dc.w    0
  1927. OldPattPos:    dc.w    0
  1928.  
  1929. OldCPU:        dc.b    0
  1930. temp:        dc.b    0
  1931. count:        dc.b    0
  1932. count2:        dc.b    0
  1933. JMPEN:        dc.b    0
  1934. PauseEn:    dc.b    0
  1935. hisam:        dc.b    0
  1936.         even
  1937.  
  1938. PauseVBL:    dc.w    0
  1939. OldDepAdr:    dc.l    0
  1940. ;modDIGI:    dc.l    0
  1941. channelenable:    dc.w    0
  1942. MixPeriodA:    dc.w    0
  1943. MixPeriodB:    dc.w    0
  1944. leng:        dc.w    0
  1945. what:        dc.w    0
  1946. CiaTempo:    dc.w    0
  1947. CiaChanged:    dc.w    0
  1948. GlobalVol:    dc.w    64
  1949.  
  1950. ; ------------------- Paremeters --------------
  1951. MainVolValue:    dc.w    64    ; 0-64
  1952.  
  1953.  
  1954. db_music:
  1955. ; free a0,a2,a3,
  1956.  
  1957.     move.b    count2(pc),d7
  1958.     cmp.b    temp(pc),d7
  1959.     blt.s    .NoNewPos
  1960.     clr.b    count2
  1961. .NoNewPos
  1962.  
  1963.  
  1964.     lea    SamVol,a4
  1965.  
  1966.  
  1967.     tst.b    temp
  1968.     beq.w    DepackDone
  1969.  
  1970.     move.b    count(pc),d7
  1971.     cmp.b    temp(pc),d7
  1972.     blt    DepackDone
  1973.  
  1974.     moveq    #0,d6
  1975.     moveq    #0,d7
  1976.     move.w    OrdNum,d7
  1977.     move.w    SongPos(pc),d6
  1978.     cmp.w    d6,d7
  1979.     bge.s    NoRepeatSong
  1980.     clr.w    SongPos
  1981.     clr.w    PattPos
  1982.     move.l    PattAdresses,a1
  1983. NoRepeatSong:
  1984.  
  1985.     moveq    #0,d7
  1986.     move.w    SongPos(pc),d7
  1987.     lea    SongOrders,a0
  1988.     add.w    d7,d7
  1989.     move.w    (a0,d7.w),d7
  1990.     lsl.w    #2,d7
  1991.     lea    PattAdresses,a1
  1992.     move.l    (a1,d7.w),a1
  1993.  
  1994. ;    tst.b    PackEnable(a5)
  1995. ;    bne.s    DepackPattern
  1996.  
  1997.     moveq    #0,d7
  1998.     move.w    PattPos(pc),d7
  1999.     moveq    #0,d6
  2000.     move.w    TrackNumber,d6
  2001.     mulu    #6,d6
  2002.     mulu    d6,d7
  2003.     add.w    d7,a1
  2004.  
  2005.     lea    UnPackedData,a6
  2006.     move.l    a1,-(sp)
  2007.     moveq    #0,d7
  2008.     move.w    TrackNumber,d7
  2009.     mulu    #6,d7
  2010.     lsr.w    #2,d7
  2011.     subq    #1,d7
  2012. CopyDataLoop
  2013.     move.l    (a1)+,(a6)+
  2014.     dbf    d7,CopyDataLoop
  2015.     move.l    (sp)+,a1
  2016.  
  2017. DepackDone
  2018.  
  2019. DB_musicMAIN:
  2020.  
  2021.     lea    UnPackedData,a1
  2022.  
  2023. ***************
  2024.     tst.b    SPAHIENABLE
  2025.     bne.s    ominplaykey
  2026. ***************
  2027.  
  2028.     moveq    #0,d6
  2029.     moveq    #0,d0
  2030.     lea    Channel1,a6
  2031.     moveq    #0,d7
  2032.     move.w    TrackNumber,d7
  2033.     subq    #1,d7
  2034. channelsloopM:
  2035.     movem.l    d0/d7/a6,-(sp)
  2036.     bsr    playvoice
  2037.     movem.l    (sp)+,d0/d7/a6
  2038.     lea    ChanArea(a6),a6
  2039.     addq    #1,d0
  2040.     dbf    d7,ChannelsLoopM
  2041.  
  2042. ***************
  2043.     bra.s    noominplaykey
  2044. ominplaykey
  2045.     clr.b    SPAHIENABLE
  2046. noominplaykey
  2047. ***************
  2048.  
  2049.  
  2050.     move.w    SongPos,OldSPos
  2051.  
  2052.  
  2053.     lea    channel1,a6
  2054.     bsr    MIXCHAN
  2055.  
  2056.     tst.b    temp
  2057.     beq.w    No_new
  2058.  
  2059.     tst.w    PauseVBL
  2060.     beq.s    NoPause
  2061.     move.b    #1,PauseEn
  2062.     subq.w    #1,PauseVBL
  2063. NoPause:
  2064.  
  2065.     move.b    count(pc),d7
  2066.     cmp.b    temp(pc),d7
  2067.     blt.s    NoNEWPos
  2068.     clr.b    count
  2069.  
  2070.     tst.w    PauseVBL
  2071.     bne.s    DoPAUSE
  2072.  
  2073.     addq.w    #1,pattpos
  2074.     clr.b    PauseEn
  2075.  
  2076.     tst.b    temp
  2077.     beq.s    NoNewPos
  2078.  
  2079.     move.l    a0,-(sp)
  2080.     moveq    #0,d7
  2081.     move.w    SongPos(pc),d7
  2082.     lea    SongOrders,a0
  2083.     add.w    d7,d7
  2084.     move.w    (a0,d7.w),d7
  2085.     lsl.w    #1,d7
  2086.     lea    PattLens,a0
  2087.     move.w    (a0,d7.w),d7
  2088.     move.l    (sp)+,a0
  2089.  
  2090.     moveq    #0,d3
  2091.     move.w    PattPos,d3
  2092.     cmp.w    d7,d3
  2093.     blt.s    NoNewPos
  2094. .newpos
  2095.     clr.w    PattPos
  2096.     addq.w    #1,SongPos
  2097. NoNewPos:
  2098.  
  2099. DoPAUSE
  2100.     addq.b    #1,count
  2101.     addq.b    #1,count2
  2102. *
  2103.     tst.w    PlayPattEn
  2104.     beq.s    .ok
  2105.     move.w    OldSpos,d7
  2106.     cmp.w    SongPos,d7
  2107.     beq.s    .ok
  2108.     move.w    d7,SongPos
  2109. .ok
  2110. *
  2111. No_NEW
  2112.     rts
  2113.  
  2114. playvoice:
  2115.     moveq    #0,d1
  2116.     move.w    MainVol(a6),d1
  2117.     cmp.l    #$40*256,d1
  2118.     ble.s    .okV1
  2119.     move.l    #$40*256,d1
  2120. .okV1
  2121.     move.l    d0,-(sp)
  2122.     moveq    #0,d0
  2123.     move.w    GlobalVol,d0
  2124.  
  2125.     cmp.w    #$40,d0
  2126.     ble.s    .okV2
  2127.     moveq    #$40,d0
  2128. .okV2
  2129.     mulu    d0,d1
  2130.     move.l    (sp)+,d0
  2131.     divu    #64,d1
  2132.     and.l    #$ffff,d1
  2133.     lsl.l    #2,d1
  2134.     bsr    ahi_volume
  2135.  
  2136.     moveq    #0,d1
  2137.     move.w    MainPeriod(a6),d1
  2138.     bsr    ahi_period
  2139.     move.w    MainPeriod(a6),OldPeriod(a6)
  2140.  
  2141.     movem.l    d0-a6,-(sp)
  2142.     move.l    LastFreq,d2
  2143.  
  2144.     moveq    #0,d3
  2145.     move.w    CiaTempo,d3
  2146.  
  2147.     divu    #50,d2
  2148.     and.l    #$ffff,d2
  2149.     mulu    #125,d2
  2150.     divu    d3,d2
  2151.     and.l    #$ffff,d2
  2152.  
  2153.     lea    SampleOffsets,a4
  2154.     cmp.l    #0,(a4,d0.w*4)
  2155.     beq.w    .zero
  2156.  
  2157.  
  2158.     lea    ahi_channels,a3
  2159.     move.b    2(a3,d0.w*4),d4
  2160.  
  2161.     lea    LoopTab,a5
  2162.     moveq    #0,d1
  2163.     move.w    OldD1(a6),d1
  2164.     lsr.w    #2,d1
  2165.     addq    #1,d1
  2166.     btst    #1,(a5,d1.w)
  2167.     beq.s    .nopingpong
  2168.     eor.b    #1,d4
  2169. .nopingpong
  2170.  
  2171.     tst.b    d4
  2172.     beq.s    .add
  2173.     sub.l    d2,(a4,d0.w*4)            ;start
  2174.     bra.s    .zero
  2175. .add
  2176.     add.l    d2,(a4,d0.w*4)            ;start
  2177. .zero
  2178.     movem.l    (sp)+,d0-a6
  2179.  
  2180.  
  2181.  
  2182.  
  2183.     moveq    #0,d1
  2184.     move.w    OldD1(a6),d1
  2185.     bsr    ahi_sample
  2186.     rts
  2187.  
  2188. ahi_volume:
  2189.     movem.l    d0-d3/a0-a2/a6,-(sp)
  2190.     move.l    ahibase,a6
  2191.  
  2192.     lea    Channel1+PANPOS,a2
  2193.     moveq    #0,d2
  2194.     move.w    d0,d2
  2195.     mulu    #ChanArea,d2
  2196.     move.l    (a2,d2.w),d2
  2197.  
  2198.     movem.l    d0-a6,-(sp)
  2199.     moveq    #AHISF_IMM,d3
  2200.     move.l    ahi_ctrl,a2
  2201.     jsr    _LVOAHI_SetVol(a6)
  2202.     movem.l    (sp)+,d0-a6
  2203.  
  2204.     movem.l    (sp)+,d0-d3/a0-a2/a6
  2205.     rts
  2206.  
  2207. LastFreq:    dc.l    0
  2208.  
  2209. ahi_period:
  2210.     movem.l    d0-d2/a0-a2/a6,-(sp)
  2211.  
  2212. ;    tst.b    OffEnable(a6)
  2213. ;    beq.w    .exit
  2214.  
  2215.     tst.l    d1
  2216.     beq.b    .exit
  2217.  
  2218.     move.l    #3546895*4,d2
  2219.     divu.l    d1,d2
  2220.     move.l    d2,d1
  2221.  
  2222.     move.l    d1,LastFreq
  2223.  
  2224.  
  2225.     moveq    #0,d7
  2226.     move.w    Mainperiod(a6),d7
  2227.     cmp.w    OldPeriod(a6),d7
  2228.     beq.s    .nonote
  2229.  
  2230.     cmp.l    #262142,d1
  2231.     ble.s    .ok
  2232.     clr.b    OffEnable(a6)
  2233.     moveq    #AHISF_IMM,d4
  2234.     moveq    #AHI_NOSOUND,d1
  2235.     move.l    ahibase,a6
  2236.     move.l    ahi_ctrl,a2
  2237.     jsr    _LVOAHI_SetSound(a6)
  2238.     bra.s    .exit
  2239. ;    move.l    #262142,d1
  2240. .ok
  2241.  
  2242.     move.l    ahibase,a6
  2243.     moveq    #AHISF_IMM,d2
  2244.     move.l    ahi_ctrl,a2
  2245.     jsr    _LVOAHI_SetFreq(a6)
  2246. .exit
  2247. .nonote
  2248.  
  2249.     movem.l    (sp)+,d0-d2/a0-a2/a6
  2250.     rts
  2251.  
  2252.  
  2253. ahi_sample:
  2254.     movem.l    d0-d2/a0-a2/a6,-(sp)
  2255.  
  2256.     tst.b    OffEnable(a6)
  2257.     beq.w    .exit
  2258.     clr.b    OffEnable(a6)
  2259.  
  2260.     moveq    #0,d3
  2261.     cmp.w    #$e40,Oldd2(a6)
  2262.     beq.w    .playmain
  2263.     cmp.w    #$e40,Oldd6(a6)
  2264.     beq.w    .playmain
  2265.  
  2266.     move.w    Oldd2(a6),d2
  2267.     lsr.w    #8,d2
  2268.     cmp.b    #3,d2
  2269.     beq.w    .exit
  2270.     cmp.b    #5,d2
  2271.     beq.w    .exit
  2272.     move.w    Oldd6(a6),d6
  2273.     lsr.w    #8,d6
  2274.     cmp.b    #3,d6
  2275.     beq.w    .exit
  2276.     cmp.b    #5,d6
  2277.     beq.w    .exit
  2278.  
  2279. ; ---------------------- calc sam offset
  2280.     moveq    #0,d4
  2281.     moveq    #0,d7
  2282.     move.b    SamOffsetA(a6),d7
  2283.     lsl.w    #8,d7
  2284.     lsl.l    #8,d7
  2285.  
  2286.     cmp.b    #$9,d2
  2287.     bne.s    .nosamoffset1
  2288.     add.l    d7,d4
  2289.     moveq    #0,d7
  2290.     move.w    OldD2(a6),d7
  2291.     and.w    #$00ff,d7
  2292.     lsl.w    #8,d7
  2293.     add.l    d7,d4
  2294.     lsr.w    #8,d7
  2295.     tst.w    d7
  2296.     beq.s    .nosend1
  2297.     move.w    d7,SlideSamOffset(a6)
  2298. .nosend1
  2299.     moveq    #0,d7
  2300. .nosamoffset1
  2301.     cmp.b    #$9,d6
  2302.     bne.s    .nosamoffset2
  2303.     add.l    d7,d4
  2304.     moveq    #0,d7
  2305.     move.w    OldD6(a6),d7
  2306.     and.w    #$00ff,d7
  2307.     lsl.w    #8,d7
  2308.     add.l    d7,d4
  2309.     move.l    d4,d7
  2310.     lsr.l    #8,d7
  2311.     tst.w    d7
  2312.     beq.s    .nosend2
  2313.     move.w    d7,SlideSamOffset(a6)
  2314. .nosend2
  2315. .nosamoffset2
  2316.  
  2317.     moveq    #0,d4
  2318.     move.w    SlideSamOffset(a6),d4
  2319.     lsl.l    #8,d4
  2320. ; --------------------------------------
  2321.  
  2322.  
  2323.     lea    Instruments,a0
  2324.     move.l    d1,d7
  2325.     lsl.w    #2,d7
  2326.     add.l    #16,d7
  2327.     and.l    #$ffff,d7
  2328.  
  2329.     lsr.l    #1,d1
  2330.     moveq    #0,d2
  2331.     move.w    2(a0,d1.w),d2
  2332.  
  2333. ; -------------------------------- do sample cursora
  2334.     cmp.w    InstrNum,d2
  2335.     bne.s    .notthis
  2336.     move.w    d0,ACTCHAN
  2337. .notthis
  2338. ; ----------------------------------------------------
  2339.  
  2340.     subq    #1,d2
  2341.     lsl.l    #2,d2
  2342.     move.l    d2,d1
  2343.  
  2344.     move.l    d1,d2
  2345.     addq.l    #4,d2
  2346.     lsr.l    #2,d2
  2347.     lea    ahi_channels,a0
  2348.     move.l    d2,(a0,d0.l*4)            ;store instr for each channel
  2349.     move.w    d7,(a0,d0.l*4)
  2350.  
  2351.     addq.l    #4,d1
  2352.     lsl.l    #2,d1
  2353.  
  2354.     lea    ahi_samples,a0
  2355.     move.l    (a0,d1.l),d2            ;start
  2356.  
  2357.     cmp.l    #0,Ahi_Sound0
  2358.     beq.s    .no16bit_1
  2359.     lsr.l    #1,d2
  2360. .no16bit_1
  2361.  
  2362.     add.l    d4,d2
  2363.     move.l    4(a0,d1.l),d3            ;length
  2364.  
  2365.     move.l    d7,d1
  2366.  
  2367.  
  2368.     sub.l    d4,d3
  2369.     bgt.s    .NieWyszlo1            ; gdy po dodaniu offsetu end<0 offsam
  2370.  
  2371.     tst.l    12(a0,d1.l)            ; ale gdy sampl jest zapetlony gra go
  2372.     beq.s    .ONEshotSample1
  2373.     move.l    (a0,d1.l),d2
  2374.     cmp.l    #0,Ahi_Sound0
  2375.     beq.s    .no16bit_2
  2376.     lsr.l    #1,d2
  2377. .no16bit_2
  2378.     add.l    8(a0,d1.l),d2
  2379.     move.l    12(a0,d1.l),d3
  2380.     bra.s    .WyszloZapetlenieDONE
  2381. .ONEshotSample1
  2382.     moveq    #AHI_NOSOUND,d1
  2383.     moveq    #AHISF_IMM,d4
  2384.     bra.w    .length_ok
  2385. .NieWyszlo1
  2386.  
  2387.     tst.l    12(a0,d1.l)
  2388.     beq.s    .ONEshotSample2
  2389.     move.l    8(a0,d1.l),d3
  2390.     add.l    12(a0,d1.l),d3
  2391.     sub.l    d4,d3
  2392.     bgt.s    .NieWyszlo2            ; gdy po dodaniu offsetu end<0 offsam
  2393.     move.l    (a0,d1.l),d2
  2394.     cmp.l    #0,Ahi_Sound0
  2395.     beq.s    .no16bit_3
  2396.     lsr.l    #1,d2
  2397. .no16bit_3
  2398.     add.l    8(a0,d1.l),d2
  2399.     move.l    12(a0,d1.l),d3
  2400. .NieWyszlo2
  2401.  
  2402. .ONEshotSample2
  2403.  
  2404. .WyszloZapetlenieDONE
  2405.  
  2406. ; ------------- test backward
  2407.     move.w    Oldd2(a6),d7
  2408.     lsr.w    #4,d7
  2409.     cmp.b    #$e3,d7
  2410.     beq.s    .backwd
  2411.     move.w    Oldd6(a6),d7
  2412.     lsr.w    #4,d7
  2413.     cmp.b    #$e3,d7
  2414.     bne.s    .no_backwd
  2415. .backwd
  2416.     add.l    d3,d2
  2417.     not.l    d3
  2418. .no_backwd
  2419. ; ----------------------------
  2420.  
  2421. .playmain
  2422.     moveq    #0,d1                ;sample bank
  2423.     moveq    #AHISF_IMM,d4
  2424.  
  2425.     lea    SampleOffsets,a6
  2426.     move.l    d2,(a6,d0.w*4)            ;start
  2427.  
  2428.  
  2429.  
  2430.     lea    SampleOffsetsFT,a6
  2431.     move.b    #1,(a6,d0.w)
  2432.  
  2433.  
  2434.     tst.l    d3
  2435.     bne.b    .length_ok            ;length=0 means "no sound"
  2436.     moveq    #AHI_NOSOUND,d1
  2437. .length_ok
  2438.  
  2439.     lea    SampleOffsets,a6
  2440.     cmp.l    #AHI_NOSOUND,d1
  2441.     bne.s    .nozero
  2442.     move.l    #0,(a6,d0.w*4)            ;start
  2443.     lea    SampleOffsetsFT,a6
  2444.     clr.b    (a6,d0.w)
  2445. .nozero
  2446.  
  2447.     move.l    ahibase,a6
  2448.     move.l    ahi_ctrl,a2
  2449.     jsr    _LVOAHI_SetSound(a6)
  2450.  
  2451. .exit    movem.l    (sp)+,d0-d2/a0-a2/a6
  2452.     rts
  2453.  
  2454. MIXCHAN:
  2455.  
  2456.     moveq    #0,d7
  2457.     move.w    TrackNumber,d7
  2458.     subq    #1,d7
  2459.  
  2460. ChannelsLoop:
  2461.     move.l    d7,-(sp)
  2462.     move.w    Oldd0(a6),d0
  2463.     move.w    Oldd1(a6),d1
  2464.     move.w    Oldd2(a6),d2
  2465.     move.w    Oldd6(a6),d6
  2466.     bsr    mainPROC
  2467.     move.w    d0,Oldd0(a6)
  2468.     move.w    d1,Oldd1(a6)
  2469.     move.w    d2,Oldd2(a6)
  2470.     move.w    d6,Oldd6(a6)
  2471.     lea    ChanArea(a6),a6
  2472.     lea    6(a1),a1
  2473.     move.l    (sp)+,d7
  2474.     dbf    d7,ChannelsLoop
  2475.     rts
  2476.  
  2477.  
  2478.  
  2479. ************* finetunes **********************************************
  2480.  
  2481. FINETUNES:
  2482.     movem.l    d1-a6,-(sp)
  2483.     lea    SamFin,a2
  2484.     moveq    #0,d4
  2485.     moveq    #0,d3
  2486.     add.w    d7,d7
  2487.     move.l    (a2,d7.w),d4
  2488.     tst.w    d0
  2489.     beq.s    .fintdone
  2490.  
  2491.     move.l    #3579545,d1
  2492.     divu    d0,d1
  2493.     and.l    #$ffff,d1
  2494. .ok8
  2495.     lsl.l    #8,d4
  2496.     beq.s    .ok7
  2497.     move.l    #8363,d2
  2498.     divu    d2,d4
  2499. .ok7    and.l    #$ffff,d4
  2500.  
  2501.     mulu    d4,d1
  2502.     lsr.l    #8,d1
  2503.  
  2504.     move.l    #3579545,d0
  2505.     tst.l    d1
  2506.     bne.s    .ok9
  2507.     moveq    #1,d1
  2508. .ok9
  2509.     divu.l    d1,d0
  2510.  
  2511. .fintdone
  2512.     movem.l    (sp)+,d1-a6
  2513.     move.w    d0,OrgPeriod(a6)
  2514.     rts
  2515.  
  2516. ; -------------- main procedure ----------------------------
  2517. mainPROC:
  2518.     move.w    OldVolA(a6),VolA(a6)
  2519.     move.w    OldVolB(a6),VolB(a6)
  2520.  
  2521.     tst.b    Temp
  2522.     beq.w    Old_data
  2523.  
  2524.     addq.w    #1,NoteCount(a6)
  2525.  
  2526.     move.b    count(pc),d7
  2527.     cmp.b    temp(pc),d7
  2528.     blt    old_data
  2529.  
  2530.     tst.b    PauseEn
  2531.     bne.w    oldperiod_1
  2532.  
  2533.     moveq    #0,d3
  2534.  
  2535.     tst.b    (a1)
  2536.     beq.w    oldperiod_1
  2537.  
  2538.     cmp.b    #$1f,(a1)
  2539.     bne.s    .novolenvoff
  2540.     addq.b    #1,VolEnvOff(a6)
  2541.     bra.w    oldInstrNum_1
  2542. .novolenvoff
  2543.  
  2544.     clr.w    NoLoopEnable
  2545.     clr.w    OldPeriod(a6)
  2546.  
  2547.     clr.w    VibratoDatasA(a6)
  2548.     clr.w    VibratoDatasB(a6)
  2549.  
  2550.     move.w    2(a1),d7
  2551.     cmp.w    #$ed0,d7
  2552.     beq.s    .ClrEnvDatas
  2553.     and.w    #$fff0,d7
  2554.     cmp.w    #$ed0,d7
  2555.     beq.s    .NoClrEnvDatas
  2556.  
  2557.     move.w    4(a1),d7
  2558.     cmp.w    #$ed0,d7
  2559.     beq.s    .ClrEnvDatas
  2560.     and.w    #$fff0,d7
  2561.     cmp.w    #$ed0,d7
  2562.     beq.s    .NoClrEnvDatas
  2563. .ClrEnvDatas
  2564.     clr.b    VolEnvOff(a6)
  2565.     clr.b    VolEnvMode(a6)
  2566.     clr.w    VolEnvTime(a6)
  2567. .NoClrEnvDatas
  2568.     move.b    #1,OffEnable(a6)
  2569.     move.b    #1,EqNewSamA(a6)
  2570.  
  2571.     moveq    #0,d0
  2572.     move.b    (a1),d0
  2573.  
  2574.     move.l    a3,-(sp)
  2575.     lea    Periods,a3
  2576.     moveq    #0,d3
  2577.     move.b    d0,d3
  2578.     lsr.b    #4,d3
  2579.     subq.b    #1,d3
  2580.     mulu    #24,d3
  2581.     and.b    #$0f,d0
  2582.     add.w    d0,d0
  2583.     add.w    d3,d0
  2584.     move.w    (a3,d0.w),d0
  2585.     move.l    (sp)+,a3
  2586.  
  2587.     move.w    2(a1),d7
  2588.     and.w    #$ff00,d7
  2589.     cmp.w    #$300,d7
  2590.     bne.s    NoClrGliss_1
  2591.     clr.w    GlissandoDatasA+4(a6)
  2592. NoClrGliss_1
  2593.     move.w    4(a1),d7
  2594.     and.w    #$ff00,d7
  2595.     cmp.w    #$300,d7
  2596.     bne.s    NoClrGliss_2
  2597.     clr.w    GlissandoDatasB+4(a6)
  2598. NoClrGliss_2
  2599.  
  2600.     cmp.b    #$18,2(a1)
  2601.     beq.s    .NoClrSlideOffset
  2602.     cmp.b    #$18,4(a1)
  2603.     beq.s    .NoClrSlideOffset
  2604.     cmp.w    #$0900,2(a1)
  2605.     beq.s    .NoClrSlideOffset
  2606.     cmp.w    #$0900,4(a1)
  2607.     beq.s    .NoClrSlideOffset
  2608.     clr.w    SlideSamOffset(a6)
  2609. .NoClrSlideOffset
  2610.  
  2611.     move.w    d0,OrgPeriodARP(a6)
  2612.     moveq    #0,d7
  2613.     move.b    1(a1),d7
  2614.     tst.w    d7
  2615.     bne.s    .notakeold
  2616.     moveq    #0,d7
  2617.     move.b    OldInstrNumA(a6),d7
  2618.     moveq    #0,d1
  2619.     move.b    d7,d1
  2620.     subq    #1,d1
  2621.     lsl.w    #2,d1
  2622. .notakeold
  2623.     add.w    d7,d7
  2624.     bsr    FINETUNES
  2625.  
  2626. *********************************************************************
  2627.  
  2628.  
  2629. oldperiod_1:
  2630.     tst.b    1(a1)
  2631.     beq.w    oldInstrNum_1
  2632.     moveq    #0,d1
  2633.     move.b    1(a1),d1
  2634.     move.b    d1,OldInstrNumA(a6)
  2635.     subq    #1,d1
  2636.     moveq    #0,d2
  2637.  
  2638.     move.b    (a4,d1.w),d2
  2639.     lsl.w    #8,d2
  2640.     move.w    d2,VolA(a6)
  2641.     lsl.w    #2,d1
  2642. oldInstrNum_1
  2643.  
  2644.     move.w    2(a1),d2
  2645.     move.w    4(a1),d6
  2646.  
  2647.     cmp.w    #$1400,d2
  2648.     bne.s    .onkeyoff1
  2649.     move.w    #$e40,d2
  2650. .onkeyoff1
  2651.     cmp.w    #$1400,d6
  2652.     bne.s    .onkeyoff2
  2653.     move.w    #$e40,d6
  2654. .onkeyoff2
  2655.  
  2656.  
  2657.     move.l    a5,-(sp)
  2658.     bsr    EffectCommandsA2
  2659.     bsr    EffectCommandsB2
  2660.     move.l    (sp)+,a5
  2661.  
  2662.  
  2663.     tst.b    OnOffChanA(a6)
  2664.     beq.s    No_Stop1
  2665.     move.w    #$e40,d2
  2666.     move.b    #1,OffEnable(a6)
  2667. No_Stop1:
  2668.  
  2669. old_data:
  2670.  
  2671.     move.b    temp(pc),d7
  2672.     subq    #1,d7
  2673.     cmp.b    count(pc),d7
  2674.     bne.s    no_CLReff
  2675.     move.w    d2,d7
  2676.     lsr.w    #8,d7
  2677.     cmp.b    #8,d7
  2678.     beq.s    no_CLReff1
  2679.     cmp.b    #3,d7
  2680.     beq.s    no_CLReff1
  2681.     cmp.b    #4,d7
  2682.     beq.s    no_CLReff1
  2683.     cmp.b    #5,d7
  2684.     beq.s    CLReffSP1
  2685.     TST.b    d7
  2686.     beq.s    no_CLReff1
  2687.  
  2688.     move.w    d2,d7
  2689.     lsr.w    #4,d7
  2690.     cmp.w    #$ec,d7
  2691.     beq.s    no_CLReff1
  2692.     cmp.w    #$e9,d7
  2693.     beq.s    no_CLReff1
  2694.     cmp.w    #$ed,d7
  2695.     beq.s    no_CLReff1
  2696.     moveq    #0,d2
  2697.     bra.s    no_CLReff1
  2698. CLReffSP1:
  2699.     move.w    #$0300,d2
  2700. no_CLReff1
  2701.     move.w    d6,d7
  2702.     lsr.w    #8,d7
  2703.     cmp.b    #3,d7
  2704.     beq.s    no_CLReff2
  2705.     cmp.b    #4,d7
  2706.     beq.s    no_CLReff2
  2707.     cmp.b    #5,d7
  2708.     beq.s    CLReffSP2
  2709.     TST.b    d7
  2710.     beq.s    no_CLReff2
  2711.  
  2712.     move.w    d6,d7
  2713.     lsr.w    #4,d7
  2714.     cmp.w    #$ec,d7
  2715.     beq.s    no_CLReff2
  2716.     cmp.w    #$e9,d7
  2717.     beq.s    no_CLReff2
  2718.     cmp.w    #$ed,d7
  2719.     beq.s    no_CLReff2
  2720.  
  2721.     moveq    #0,d6
  2722.     bra.s    no_CLReff2
  2723. CLReffSP2:
  2724.     move.w    #$0300,d6
  2725. no_CLReff2
  2726.  
  2727. no_CLReff
  2728.  
  2729.  
  2730.     move.l    a5,-(sp)
  2731.     bsr    EffectCommandsA
  2732.     bsr    EffectCommandsB
  2733.     move.l    (sp)+,a5
  2734.  
  2735.     move.w    d0,GlissandoDatasA+2(a6)
  2736.     move.w    d0,GlissandoDatasB+2(a6)
  2737.  
  2738.  
  2739. ; -----------------------------------
  2740.     bsr    VolumeEnvelope
  2741. ; -----------------------------------
  2742.  
  2743.     move.w    VolA(a6),OldVolA(a6)
  2744.     move.w    VolB(a6),OldVolB(a6)
  2745.  
  2746.  
  2747.     tst.w    d0
  2748.     beq    nothing
  2749.  
  2750.     move.w    d0,MainPeriod(a6)
  2751.     move.w    VolA(a6),d3
  2752.     tst.w    d7
  2753.     bne.s    .onim
  2754.     move.w    d3,MainVol(a6)
  2755. .onim
  2756.     rts
  2757. nothing:
  2758.     tst.w    MainPeriod(a6)
  2759.     beq.s    nostopperiod
  2760.     move.w    #-1,MainPeriod(a6)
  2761. nostopperiod
  2762.     rts
  2763.  
  2764.  
  2765.  
  2766. ;- - - - - - - - - - - -  envelopes
  2767. VolumeEnvelope:
  2768.     movem.l    d0-d6/a0-a6,-(sp)
  2769.  
  2770.  
  2771.     tst.w    d0
  2772.     beq.w    .noenvelope
  2773.  
  2774.     move.l    d1,d0
  2775.     lsr.l    #2,d0
  2776.     lea    VolEnvelope,a0
  2777.     mulu    #134,d0
  2778.     add.w    d0,a0
  2779.  
  2780.     tst.b    VolEnvOff(a6)
  2781.     beq.s    .doenvelope
  2782.     btst.b    #0,(a0)        ; vol env points
  2783.     bne.s    .doenvelope
  2784.     clr.b    VolEnvOff(a6)
  2785.     clr.w    VolA(a6)
  2786.     bra.w    .noenvelope
  2787. .doenvelope
  2788.  
  2789.     btst    #0,(a0)
  2790.     beq.w    .noenvelope
  2791.  
  2792.  
  2793.     lea    6(a0),a1
  2794.     moveq    #0,d0
  2795.     moveq    #0,d1
  2796.     moveq    #0,d2
  2797.     moveq    #0,d3
  2798.     moveq    #0,d4
  2799.     moveq    #0,d5
  2800.     move.b    1(a0),d4    ; vol env points
  2801.     tst.w    d4
  2802.     beq.w    .noenvelope
  2803.  
  2804.     addq.w    #1,VolEnvTime(a6)
  2805.  
  2806. ;-------- envelope loop -------------
  2807.  
  2808.     btst    #1,VolEnvMode(a6)
  2809.     bne.s    .noloop
  2810.  
  2811.     btst    #2,(a0)
  2812.     beq.s    .noloop
  2813.  
  2814.     move.b    4(a0),d5    ; 2nd loop point
  2815.     lsl.w    #2,d5
  2816.     move.w    (a1,d5.w),d0
  2817.     cmp.w    VolEnvTime(a6),d0
  2818.     bgt.w    .noloop
  2819.  
  2820.     tst.b    VolEnvOff(a6)
  2821.     bne.s    .setloop
  2822.  
  2823.     move.b    3(a0),d5    ; 1st loop point
  2824.     lsl.w    #2,d5
  2825.     move.w    (a1,d5.w),VolEnvTime(a6)
  2826.     bra.s    .noloop
  2827. .setloop
  2828.     bset    #1,VolEnvMode(a6)
  2829.     tst.b    VolEnvOff(a6)
  2830.     beq.s    .noloop
  2831.     subq.b    #1,VolEnvOff(a6)
  2832. .noloop
  2833.  
  2834. ;-------- envelope sustain1 -------------
  2835.  
  2836.     btst    #0,VolEnvMode(a6)
  2837.     bne.s    .nosustain1
  2838.  
  2839.     btst    #1,(a0)
  2840.     beq.s    .nosustain1
  2841.  
  2842.     move.b    2(a0),d5    ; sustain1 point 
  2843.     lsl.w    #2,d5
  2844.     move.w    (a1,d5.w),d0
  2845.  
  2846.     addq    #1,d0
  2847.     cmp.w    VolEnvTime(a6),d0
  2848.     bne.w    .nosustain1
  2849.  
  2850.     tst.b    VolEnvOff(a6)
  2851.     bne.s    .setsustain1
  2852.  
  2853.     move.w    (a1,d5.w),VolEnvTime(a6)
  2854.     bra.s    .nosustain1
  2855. .setsustain1
  2856.     bset    #0,VolEnvMode(a6)
  2857.     tst.b    VolEnvOff(a6)
  2858.     beq.s    .nosustain1
  2859.     subq.b    #1,VolEnvOff(a6)
  2860. .nosustain1
  2861.  
  2862. ;-------- envelope sustain2 -------------
  2863.  
  2864.     btst    #2,VolEnvMode(a6)
  2865.     bne.s    .nosustain2
  2866.  
  2867.     btst    #3,(a0)
  2868.     beq.s    .nosustain2
  2869.  
  2870.     move.b    5(a0),d5    ; sustain2 point
  2871.     lsl.w    #2,d5
  2872.     move.w    (a1,d5.w),d0
  2873.  
  2874.     addq    #1,d0
  2875.     cmp.w    VolEnvTime(a6),d0
  2876.     bne.w    .nosustain2
  2877.  
  2878.     tst.b    VolEnvOff(a6)
  2879.     bne.s    .setsustain2
  2880.  
  2881.     move.w    (a1,d5.w),VolEnvTime(a6)
  2882.     bra.s    .nosustain2
  2883. .setsustain2
  2884.     bset    #2,VolEnvMode(a6)
  2885.     tst.b    VolEnvOff(a6)
  2886.     beq.s    .nosustain2
  2887.     subq.b    #1,VolEnvOff(a6)
  2888. .nosustain2
  2889.  
  2890. ;---------------------------------------
  2891.  
  2892.  
  2893.  
  2894. .getpoint
  2895.     move.w    (a1),d0
  2896.     cmp.w    VolEnvTime(a6),d0
  2897.     blt.s    .nextpoint
  2898.     tst.w    VolEnvTime(a6)
  2899.     beq.s    .firstpoint
  2900.     bra.s    .thispoint
  2901. .nextpoint
  2902.     addq    #4,a1
  2903.     dbf    d4,.getpoint
  2904.     subq    #1,VolEnvTime(a6)
  2905.     subq    #4,a1
  2906. .thispoint
  2907.     subq    #4,a1
  2908. .firstpoint
  2909.     move.w    (a1),d0        ; time
  2910.     move.w    4(a1),d1
  2911.  
  2912.     moveq    #0,d2
  2913.     moveq    #0,d3
  2914.  
  2915.     move.w    2(a1),d2    ; vol
  2916.     move.w    6(a1),d3
  2917.  
  2918.  
  2919.     sub.w    d2,d3
  2920.     ext.l    d3
  2921.     asl.l    #8,d3
  2922.     sub.w    d0,d1
  2923.     beq.s    .nodiv1
  2924.     divs    d1,d3
  2925. .nodiv1
  2926.     and.l    #$ffff,d3
  2927.     ext.l    d3
  2928.  
  2929.     moveq    #0,d0
  2930.     move.w    (a1),d0            ; time
  2931.     moveq    #0,d1
  2932.     move.w    VolEnvTime(a6),d1
  2933.     tst.l    d3
  2934.     bge.s    .ok1
  2935.     move.w    4(a1),d0        ; time
  2936.     moveq    #0,d5
  2937.     move.w    6(a1),d5
  2938.     lsl.w    #8,d5
  2939.     bra.s    .ok2
  2940. .ok1
  2941.     moveq    #0,d5
  2942.     move.w    2(a1),d5
  2943.     lsl.w    #8,d5
  2944. .ok2
  2945.  
  2946.     sub.w    d0,d1
  2947.     bne.s    .niezero        ; gdy rowne zero czas na envelopa
  2948.     move.w    6(a1),d3        ; dobiegl konca (przesyla koncowa
  2949.     lsl.w    #8,d3            ; glosnosc)
  2950.     bra.s    .envelopefinished
  2951. .niezero
  2952.     muls    d1,d3
  2953.     add.w    d5,d3
  2954. .envelopefinished
  2955.  
  2956.     moveq    #0,d4
  2957.     move.w    VolA(a6),d4
  2958.     divu    #64,d4
  2959.     and.l    #$ffff,d4
  2960.     mulu    d3,d4
  2961.     lsr.l    #8,d4
  2962.     move.w    d4,MainVol(a6)
  2963.  
  2964.  
  2965. ;    move.l    muj,a5
  2966. ;    move.w    d4,(a5)+
  2967. ;    move.l    a5,muj
  2968.  
  2969.     moveq    #1,d7
  2970.     bra.s    .envelopedone
  2971. .noenvelope
  2972.     moveq    #0,d7
  2973. .envelopedone
  2974.     movem.l    (sp)+,d0-d6/a0-a6
  2975. ;- - - - - - - - - - - -  envelopes end
  2976.     rts
  2977.  
  2978.  
  2979. ;muj:    dc.l    huj
  2980.  
  2981. ; --------------------------- EffectCommands ---------------------------
  2982.  
  2983. EffectCommandsA2:
  2984. ; effects 9xx, bxx, cxx, dxx, fxx, gxx, lxx, oxx chan A
  2985.  
  2986.     move.w    d2,d7
  2987.     beq    EffComA2exit
  2988.     lsr.w    #8,d7
  2989.     clr.b    channelenable
  2990.     move.w    d2,d3
  2991.  
  2992.     cmp.b    #8,d7
  2993.     beq    Pannings2
  2994.  
  2995.     lea    SamoffsetA(a6),a5
  2996.     cmp.b    #9,d7
  2997.     beq    SampleOffset
  2998.  
  2999.     cmp.b    #$b,d7
  3000.     beq    SongRepeat
  3001.  
  3002.     lea    VolA(a6),a5
  3003.     cmp.b    #$c,d7
  3004.     beq    SetVolume
  3005.  
  3006.     cmp.b    #$10,d7
  3007.     beq    SetGlobalVolume
  3008.  
  3009.     cmp.b    #$15,d7
  3010.     beq    SetEnvelopePos
  3011.  
  3012.     lea    Hex(pc),a5
  3013.     cmp.b    #$d,d7
  3014.     beq    PattBreak
  3015.  
  3016.     cmp.b    #$f,d7
  3017.     beq    SetTempo
  3018.  
  3019.     lea    OldSlideOffsetA(a6),a5
  3020.     cmp.b    #$18,d7
  3021.     beq    SlideOffset
  3022.  
  3023. ; effects E0x, E1x, E2x, E4x, E4x, E6x, E7x, E8x, EAx, EBx EEx chan A
  3024.  
  3025.     cmp.w    #$e00,d3
  3026.     beq.w    OffFilter
  3027.  
  3028.     cmp.w    #$e01,d3
  3029.     beq.w    OnFilter
  3030.  
  3031.     cmp.w    #$e50,d3
  3032.     beq.w    OffChannelA
  3033.  
  3034.     cmp.w    #$e51,d3
  3035.     beq.w    OnChannelA
  3036.  
  3037.     move.w    d2,d7
  3038.     lsr.w    #4,d7
  3039.     move.w    d2,d3
  3040.  
  3041.     cmp.b    #$e1,d7
  3042.     beq.w    FineSlideUp
  3043.  
  3044.     cmp.b    #$e2,d7
  3045.     beq.w    FineSlideDown
  3046.  
  3047.     cmp.b    #$e4,d7
  3048.     beq.w    TurnOffSam
  3049.  
  3050.     lea    loopsdataschanA(a6),a5
  3051.     cmp.b    #$e6,d7
  3052.     beq.w    Loops
  3053.  
  3054.     lea    SamOffsetA(a6),a5
  3055.     cmp.b    #$e7,d7
  3056.     beq    offsets
  3057.  
  3058.     cmp.b    #$e8,d7
  3059.     beq    pannings
  3060.  
  3061.     lea    VolA(a6),a5
  3062.     cmp.b    #$ea,d7
  3063.     beq    FineVolUp
  3064.  
  3065.     cmp.b    #$eb,d7
  3066.     beq    FineVolDown
  3067.  
  3068.     cmp.b    #$ee,d7
  3069.     beq    Pause
  3070.  
  3071. EffComA2exit
  3072.     rts
  3073.  
  3074. EffectCommandsB2:
  3075. ; effects 9xx, bxx, cxx, dxx, fxx, gxx, lxx, oxx chan B
  3076.  
  3077.     move.w    d6,d7
  3078.     beq    EffComB2exit
  3079.     lsr.w    #8,d7
  3080.     move.b    #1,channelenable
  3081.     move.w    d6,d3
  3082.  
  3083.     cmp.b    #8,d7
  3084.     beq    Pannings2
  3085.  
  3086.     lea    SamoffsetB(a6),a5
  3087.     cmp.b    #9,d7
  3088.     beq    SampleOffset
  3089.  
  3090.     cmp.b    #$b,d7
  3091.     beq    SongRepeat
  3092.  
  3093.     lea    VolA(a6),a5
  3094.     cmp.b    #$c,d7
  3095.     beq    SetVolume
  3096.  
  3097.     cmp.b    #$10,d7
  3098.     beq    SetGlobalVolume
  3099.  
  3100.     cmp.b    #$15,d7
  3101.     beq    SetEnvelopePos
  3102.  
  3103.     lea    Hex(pc),a5
  3104.     cmp.b    #$d,d7
  3105.     beq    PattBreak
  3106.  
  3107.     cmp.b    #$f,d7
  3108.     beq    SetTempo
  3109.  
  3110.     lea    OldSlideOffsetB(a6),a5
  3111.     cmp.b    #$18,d7
  3112.     beq    SlideOffset
  3113.  
  3114. ; effects E0x, E1x, E2x, E4x, E4x, E6x, E7x, E8x, EAx, EBx EEx chan B
  3115.  
  3116.     cmp.w    #$e00,d3
  3117.     beq.w    OffFilter
  3118.  
  3119.     cmp.w    #$e01,d3
  3120.     beq.w    OnFilter
  3121.  
  3122.     cmp.w    #$e50,d3
  3123.     beq.w    OffChannelA
  3124.  
  3125.     cmp.w    #$e51,d3
  3126.     beq.w    OnChannelA
  3127.  
  3128.     move.w    d6,d7
  3129.     lsr.w    #4,d7
  3130.     move.w    d6,d3
  3131.  
  3132.     cmp.b    #$e1,d7
  3133.     beq.w    FineSlideUp
  3134.  
  3135.     cmp.b    #$e2,d7
  3136.     beq.w    FineSlideDown
  3137.  
  3138.     cmp.b    #$e4,d7
  3139.     beq.w    TurnOffSam
  3140.  
  3141.     lea    loopsdataschanB(a6),a5
  3142.     cmp.b    #$e6,d7
  3143.     beq.w    Loops
  3144.  
  3145.     lea    SamOffsetA(a6),a5
  3146.     cmp.b    #$e7,d7
  3147.     beq    offsets
  3148.  
  3149.     cmp.b    #$e8,d7
  3150.     beq    pannings
  3151.  
  3152.     lea    VolA(a6),a5
  3153.     cmp.b    #$ea,d7
  3154.     beq    FineVolUp
  3155.  
  3156.     cmp.b    #$eb,d7
  3157.     beq    FineVolDown
  3158.  
  3159.     cmp.b    #$ee,d7
  3160.     beq    Pause
  3161.  
  3162. EffComB2exit
  3163.     rts
  3164.  
  3165.  
  3166.  
  3167.  
  3168. EffectCommandsA:
  3169. ; effects 0xx 1xx, 2xx, 3xx, 4xx, 5xx, 6xx, axx, hxx chan A
  3170.     move.w    d2,d7
  3171.     beq    EffComAexit
  3172.     lsr.w    #8,d7
  3173.     clr.b    channelenable
  3174.     move.w    d2,d3
  3175.  
  3176.     lea    OrgPeriodARP(a6),a5
  3177.     tst.b    d7
  3178.     beq.w    Arpeggio
  3179.  
  3180.     cmp.b    #1,d7
  3181.     beq.w    PortUp
  3182.  
  3183.     cmp.b    #2,d7
  3184.     beq.w    PortDown
  3185.  
  3186.     lea    GlissandoDatasA(a6),a5
  3187.     cmp.b    #3,d7
  3188.     beq.w    Glissando
  3189.  
  3190.     lea    VibratoDatasA(a6),a5
  3191.     cmp.b    #4,d7
  3192.     beq.w    Vibrato
  3193.  
  3194.     cmp.b    #5,d7
  3195.     beq.w    SlideVolGliss
  3196.  
  3197.     cmp.b    #6,d7
  3198.     beq.w    SlideVolVib
  3199.  
  3200.     lea    VolA(a6),a5
  3201.     cmp.b    #$a,d7
  3202.     beq    SlideVolume
  3203.  
  3204.     lea    OldGlobalVolA(a6),a5
  3205.     cmp.b    #$11,d7
  3206.     beq    SlideGlobalVolume
  3207.  
  3208. ; effects E9x, ECx EDx chan A
  3209.  
  3210.     move.w    d2,d7
  3211.     lsr.w    #4,d7
  3212.     move.w    d2,d3
  3213.  
  3214.     lea    RetraceCntA(a6),a5
  3215.     cmp.b    #$e9,d7
  3216.     beq.w    Retrace
  3217.  
  3218.     lea    VolA(a6),a5
  3219.     cmp.b    #$ec,d7
  3220.     beq    CutSample
  3221.  
  3222.     lea    NoteDelayPeriodA(a6),a5
  3223.     cmp.b    #$ed,d7
  3224.     beq    DelaySample
  3225. EffComAexit
  3226.     rts
  3227.  
  3228.  
  3229. EffectCommandsB:
  3230. ; effects 1xx, 2xx, 3xx, 4xx, 5xx, 6xx, axx, hxx chan B
  3231.     move.w    d6,d7
  3232.     beq    EffComBexit
  3233.     lsr.w    #8,d7
  3234.     move.b    #1,channelenable
  3235.     move.w    d6,d3
  3236.  
  3237.     lea    OrgPeriodARP(a6),a5
  3238.     tst.b    d7
  3239.     beq.w    Arpeggio
  3240.  
  3241.     cmp.b    #1,d7
  3242.     beq.w    PortUp
  3243.  
  3244.     cmp.b    #2,d7
  3245.     beq.w    PortDown
  3246.  
  3247.     lea    GlissandoDatasB(a6),a5
  3248.     cmp.b    #3,d7
  3249.     beq.w    Glissando
  3250.  
  3251.     lea    VibratoDatasB(a6),a5
  3252.     cmp.b    #4,d7
  3253.     beq.w    Vibrato
  3254.  
  3255.     cmp.b    #5,d7
  3256.     beq.w    SlideVolGliss
  3257.  
  3258.     cmp.b    #6,d7
  3259.     beq.w    SlideVolVib
  3260.  
  3261.     lea    VolB(a6),a5    ; musi byc B
  3262.     cmp.b    #$a,d7
  3263.     beq    SlideVolume
  3264.  
  3265.     lea    OldGlobalVolB(a6),a5
  3266.     cmp.b    #$11,d7
  3267.     beq    SlideGlobalVolume
  3268. ; effects E9x, ECx, EDx chan B
  3269.  
  3270.     move.w    d6,d7
  3271.     lsr.w    #4,d7
  3272.     move.w    d6,d3
  3273.  
  3274.     lea    RetraceCntB(a6),a5
  3275.     cmp.b    #$e9,d7
  3276.     beq.w    Retrace
  3277.  
  3278.     lea    VolA(a6),a5
  3279.     cmp.b    #$ec,d7
  3280.     beq    CutSample
  3281.  
  3282.     lea    NoteDelayPeriodB(a6),a5
  3283.     cmp.b    #$ed,d7
  3284.     beq    DelaySample
  3285. EffComBexit
  3286.     rts
  3287.  
  3288. ;------------------------------ effects -------------------------------------
  3289. TurnOffSam:
  3290.     move.b    #1,OffEnable(a6)
  3291.     rts
  3292.  
  3293. SetEnvelopePos:
  3294.     moveq    #0,d7
  3295.     move.b    d3,d7
  3296.     move.w    d7,VolEnvTime(a6)
  3297.     moveq    #0,d3
  3298.     rts
  3299.  
  3300.  
  3301. ;looppattpos    (a5)      0OFS
  3302. ;loopsongpos    1(a5)     1OFS
  3303. ;loophowmany    2(a5)     2OFS
  3304.  
  3305. _0OFS    equ    0
  3306. _1OFS    equ    2
  3307. _2OFS    equ    1
  3308.  
  3309. loops:
  3310.     cmp.w    #$e60,d3
  3311.     bne.s    no_loop
  3312.     tst.b    _2OFS(a5)
  3313.     bne.s    loops_done
  3314.     moveq    #0,d7
  3315.     move.w    pattpos(pc),d7
  3316.     move.b    d7,(a5)
  3317.  
  3318.     move.w    songpos(pc),_1OFS(a5)
  3319.  
  3320.     bra.s    loops_done
  3321. no_loop
  3322.     tst.b    _2OFS(a5)
  3323.     beq.s    storehowmany
  3324.     subq.b    #1,_2OFS(a5)
  3325.     bne.s    no_done
  3326.     clr.b    (a5)
  3327.     clr.w    _1OFS(a5)
  3328.     clr.b    _2OFS(a5)
  3329.     bra.s    loops_done
  3330. no_done
  3331.     moveq    #0,d7
  3332.     move.b    (a5),d7
  3333.     subq.w    #1,d7
  3334.     move.w    d7,PattPos
  3335.  
  3336.     move.w    _1OFS(a5),songpos
  3337.     bra.s    loops_done
  3338. storehowmany
  3339.     and.b    #$0f,d3
  3340.     move.b    d3,_2OFS(a5)
  3341.  
  3342.     moveq    #0,d7
  3343.     move.b    (a5),d7
  3344.     subq.w    #1,d7
  3345.     move.w    d7,PattPos
  3346.  
  3347.     move.w    _1OFS(a5),songpos
  3348. loops_done
  3349.     rts
  3350.  
  3351. Pause:
  3352.     tst.b    PauseEn
  3353.     bne.s    no_pause
  3354.  
  3355.     moveq    #0,d7
  3356.     move.b    d3,d7
  3357.     and.b    #$0f,d7
  3358.     beq.s    No_pause
  3359.     moveq    #0,d3
  3360.     move.b    Temp(pc),d3
  3361.     mulu    d3,d7
  3362.     addq.w    #1,d7
  3363.     move.w    d7,PauseVBL
  3364. no_pause
  3365.     rts
  3366.  
  3367. SongRepeat:
  3368.     move.w    #-1,pattpos
  3369.     moveq    #0,d7
  3370.     move.b    d3,d7
  3371.     cmp.w    #1024,d7
  3372.     blt.s    songrep_ok
  3373.     move.w    #1024,d7
  3374. songrep_ok
  3375.     move.w    d7,songpos
  3376.     rts
  3377.  
  3378. PattBreak:
  3379.     moveq    #0,d7
  3380.     move.b    d3,d7
  3381.     cmp.w    #99,d7
  3382.     blt.s    patt_ok
  3383.     move.w    #99,d7
  3384. patt_ok
  3385.     cmp.w    #-1,pattpos
  3386.     beq.s    NoAddSP
  3387.     move.l    d0,-(sp)
  3388.     moveq    #0,d0
  3389.     move.w    OrdNum,d0
  3390.     cmp.w    SongPos,d0
  3391.     bne.s    .skip1
  3392.     clr.w    SongPos
  3393.     bra.s    .skip2
  3394. .skip1
  3395.     addq.w    #1,songpos
  3396. .skip2
  3397.     move.l    (sp)+,d0
  3398. NoAddSP
  3399.     move.l    d0,-(sp)
  3400.     moveq    #0,d0
  3401.     move.b    (a5,d7.w),d0
  3402.     move.w    d0,pattpos
  3403.     subq.w    #1,pattpos
  3404.     move.l    (sp)+,d0
  3405.     rts
  3406.  
  3407. SampleOffset:
  3408.     tst.b    d3
  3409.     bne.w    .nozero
  3410.  
  3411. .nozero
  3412.     moveq    #0,d7
  3413.     move.b    (a5),d7
  3414.     lsl.w    #8,d7
  3415.     lsl.l    #8,d7
  3416.     and.w    #$00ff,d3
  3417.     lsl.w    #8,d3
  3418.     add.w    d3,d7
  3419.     tst.b    channelenable
  3420.     bne.s    SamOffsChanB
  3421. ;    add.l    d7,(a2,d1.w)
  3422.     rts
  3423. SamOffsChanB
  3424. ;    add.l    d7,124(a2,d5.w)
  3425.     rts
  3426.  
  3427.  
  3428. offsets:
  3429.     move.b    d3,d7
  3430.     and.b    #$0f,d7
  3431.     move.b    d7,(a5)
  3432.     rts
  3433.  
  3434.  
  3435.  
  3436. pannings:
  3437.     moveq    #0,d7
  3438.     move.b    d3,d7
  3439.     and.b    #$0f,d7
  3440.     mulu    #4369,d7
  3441.     lea    PANPOS(a6),a5
  3442.     move.l    d7,(a5)
  3443.     rts
  3444.  
  3445. pannings2:
  3446.     moveq    #0,d7
  3447.     move.b    d3,d7
  3448.     mulu    #257,d7
  3449.     lea    PANPOS(a6),a5
  3450.     move.l    d7,(a5)
  3451.     rts
  3452.  
  3453. ;SlidePan:
  3454. ;    tst.b    d3
  3455. ;    bne.s    NoOldSlidePan
  3456. ;    move.b    2(a5),d3
  3457. ;NoOldSlidePan
  3458. ;    move.b    d3,2(a5)
  3459. ;
  3460. ;    moveq    #0,d7
  3461. ;    move.b    d3,d7
  3462. ;    cmp.w    #$10,d7
  3463. ;    blt.s    Voldown
  3464. ;
  3465. ;    and.b    #$0f,d7
  3466. ;    cmp.b    #$0f,d7
  3467. ;    beq.s    FineVol
  3468. ;    move.b    d3,d7
  3469. ;    and.b    #$f0,d7
  3470. ;    cmp.b    #$f0,d7
  3471. ;    beq.s    FineVol
  3472. ;
  3473. ;    move.b    d3,d7
  3474. ;    lsr.b    #4,d7
  3475. ;    add.b    d7,VolA(a6)
  3476. ;    cmp.b    #64,VolA(a6)
  3477. ;    blt.s    Voldone
  3478. ;    move.b    #64,VolA(a6)
  3479. ;    rts
  3480. ;Voldown
  3481. ;    and.b    #$f0,d7
  3482. ;
  3483. ;    sub.b    d3,VolA(a6)
  3484. ;    tst.b    VolA(a6)
  3485. ;    bgt.s    Voldone
  3486. ;    clr.b    VolA(a6)
  3487. ;Voldone:rts
  3488.  
  3489.  
  3490.  
  3491. SetTempo:
  3492.     moveq    #0,d7
  3493.     move.b    d3,d7
  3494.     tst.w    d7
  3495.     beq.s    .Set
  3496.     cmp.w    #$1f,d7
  3497.     bgt.s    Cia_temp
  3498. .Set
  3499.     move.b    d3,temp
  3500.     move.b    d3,orgtemp
  3501.     move.b    d3,count
  3502.     rts
  3503. Cia_temp
  3504.  
  3505. SetAHItempo:
  3506.     move.w    d7,CiaTempo
  3507.     and.l    #$ffff,d7
  3508.     lsl.w    #1,d7
  3509.     divu    #5,d7
  3510.     and.l    #$ffff,d7
  3511.     swap    d7
  3512.     move.l    d7,afreq
  3513.  
  3514.     movem.l    d0-a6,-(sp)
  3515.     move.l    ahibase(pc),a6
  3516.     lea    atags(pc),a1
  3517.     move.l    ahi_ctrl(pc),a2
  3518.     jsr    _LVOAHI_ControlAudioA(a6)
  3519.     movem.l    (sp)+,d0-a6
  3520.     rts
  3521. atags
  3522.     dc.l    AHIA_PlayerFreq
  3523. afreq    dc.l    50<<16
  3524.     dc.l    TAG_DONE
  3525.  
  3526.  
  3527. OffChannelA:
  3528.     bset    #0,OnOffChanA(a6)
  3529.     rts
  3530. OnChannelA:
  3531.     bclr    #0,OnOffChanA(a6)
  3532.     rts
  3533. OffChannelB:
  3534.     bset    #0,OnOffChanB(a6)
  3535.     rts
  3536. OnChannelB:
  3537.     bclr    #0,OnOffChanB(a6)
  3538.     rts
  3539.  
  3540. OffFilter:
  3541.     bclr    #1,$bfe001
  3542.     rts
  3543. OnFilter:
  3544.     bset    #1,$bfe001
  3545.     rts
  3546.  
  3547.  
  3548.  
  3549. Retrace:
  3550.     cmp.b    #1,count
  3551.     bne.s    retrno_2
  3552.     clr.b    (a5)
  3553. retrno_2
  3554.     moveq    #0,d7
  3555.     move.b    d3,d7
  3556.     and.b    #$0f,d7
  3557.     subq.b    #1,d7
  3558.     cmp.b    (a5),d7
  3559.     bne.s    retrno_1
  3560.  
  3561.     tst.b    channelenable
  3562.     beq.s    retr_chan_a
  3563. ;    move.l    (a0,d5.w),124(a2,d5.w)    ; adres sampla
  3564.     move.b    #1,OffEnable(a6)
  3565.     bra.s    retr_chan_b
  3566. retr_chan_a
  3567.     move.b    #1,OffEnable(a6)
  3568. ;    move.l    (a0,d1.w),(a2,d1.w)    ; adres sampla
  3569. retr_chan_b
  3570.     clr.b    (a5)
  3571.     rts
  3572. retrno_1
  3573.     addq.b    #1,(a5)
  3574. no_retrace_1
  3575.     rts
  3576.  
  3577. cutsample:
  3578.     moveq    #0,d7
  3579.     move.b    d3,d7
  3580.     and.b    #$0f,d7
  3581.     beq.s    .doit
  3582.     cmp.b    count(pc),d7
  3583.     bne.s    no_cut_sam
  3584.  
  3585.  
  3586.     moveq    #0,d7
  3587.     move.b    count,d7
  3588.     cmp.b    temp(pc),d7
  3589.     beq.s    no_cut_sam
  3590.  
  3591. .doit    clr.w    (a5)
  3592. no_cut_sam:
  3593.     rts
  3594.  
  3595.  
  3596. delaysample:
  3597.     moveq    #0,d7
  3598.     move.b    d3,d7
  3599.     and.b    #$0f,d7
  3600.     beq.s    no_delay_sam
  3601.  
  3602.     clr.b    OffEnable(a6)
  3603.  
  3604.     moveq    #0,d7
  3605.     move.b    count2,d7
  3606.     bne.s    .nostore
  3607.     move.w    d0,(a5)
  3608.     move.w    d1,2(a5)
  3609. .nostore
  3610.     move.w    OldD0(a6),d0
  3611.     move.w    OldD1(a6),d1
  3612.  
  3613.     moveq    #0,d7
  3614.     move.b    d3,d7
  3615.     and.b    #$0f,d7
  3616.  
  3617.     cmp.b    count2(pc),d7
  3618.     bne.s    no_delay_sam
  3619.     move.w    (a5),d0
  3620.     move.w    2(a5),d1
  3621.     clr.w    OldPeriod(a6)
  3622.     move.b    #1,OffEnable(a6)
  3623.  
  3624.     clr.b    VolEnvOff(a6)
  3625.     clr.b    VolEnvMode(a6)
  3626.     clr.w    VolEnvTime(a6)
  3627. no_delay_sam:
  3628.     rts
  3629.  
  3630. ; ------------- arpeggio -------------
  3631. arplist:
  3632.     dc.b 0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1
  3633. Arpeggio:
  3634.     movem.l    d2/a6,-(sp)
  3635.     bsr    ArpeggioMain
  3636.     movem.l    (sp)+,d2/a6
  3637.     move.l    d1,d7
  3638.     lsr.w    #1,d7
  3639.     addq    #2,d7
  3640.     bsr    FINETUNES
  3641.  
  3642.     move.w    d0,VibratoDatasA(a6)
  3643.     move.w    d0,VibratoDatasB(a6)
  3644.     rts
  3645.  
  3646. ArpeggioMain:
  3647.     moveq    #0,d7
  3648.     move.b    count(pc),d7
  3649.     subq.b    #1,d7
  3650.  
  3651.     move.b    arplist(pc,d7.w),d7
  3652.     beq.s    arp0
  3653.     cmp.b    #2,d7
  3654.     beq.s    arp2
  3655.  
  3656. arp1:    moveq    #0,d2
  3657.     move.b    d3,d2
  3658.     lsr.b    #4,d2
  3659.     bra.s    arpdo
  3660.  
  3661. arp2:    moveq    #0,d2
  3662.     move.b    d3,d2
  3663.     and.b    #$f,d2
  3664. arpdo:
  3665.     asl.w    #1,d2
  3666.     move.w    (a5),d7
  3667.     lea    periods,a6
  3668.     moveq    #12*7,d3
  3669. arp3:    cmp.w    (a6)+,d7
  3670.     bge.s    arpfound
  3671.     dbf    d3,arp3
  3672. arp0:
  3673.     tst.b    channelenable
  3674.     bne.s    ARP_chanB1
  3675.     move.w    (a5),d0
  3676.     rts
  3677. ARP_chanB1
  3678.     move.w    (a5),d0
  3679.     rts
  3680. arpfound:
  3681.     add.w    d2,a6
  3682.     cmp.l    #PeriodsEnd,a6
  3683.     ble.s    ArpOk1
  3684.     move.l    #PeriodsEnd,a6
  3685.     moveq    #0,d2
  3686.     bra.s    ArpOk2
  3687. ArpOk1    sub.w    d2,a6
  3688. ArpOk2    tst.b    channelenable
  3689.     bne.s    ARP_chanB2
  3690.     move.w    -2(a6,d2.w),d0
  3691.     rts
  3692. ARP_chanB2
  3693.     move.w    -2(a6,d2.w),d0
  3694.     rts
  3695.  
  3696. ; ------------- portamento up -------------
  3697.  
  3698. PortUp:
  3699.     moveq    #0,d7
  3700.     move.b    d3,d7
  3701.  
  3702.     tst.b    channelenable
  3703.     bne.s    PortUp_chan_b
  3704.     
  3705. PortUp_chan_a
  3706.     tst.b    d7
  3707.     bne.s    NoOldPortUpA
  3708.     move.b    PortUpOldValA(a6),d7
  3709. NoOldPortUpA
  3710.     move.b    d7,PortUpOldValA(a6)
  3711.  
  3712.     move.b    d7,d3
  3713.     and.b    #$f0,d7
  3714.     cmp.b    #$f0,d7
  3715.     beq.w    FineSU
  3716.     move.b    d3,d7
  3717.  
  3718.     lsl.w    #2,d7
  3719.     sub.w    d7,d0
  3720. ;    cmp.w    #113,d0
  3721. ;    bge.s    PortUpOkA
  3722. ;    move.w    #113,d0
  3723. ;PortUpOkA
  3724.     move.w    d0,VibratoDatasA(a6)
  3725.     move.w    d0,VibratoDatasB(a6)
  3726.     rts
  3727.  
  3728. PortUp_chan_b
  3729.     tst.b    d7
  3730.     bne.s    NoOldPortUpB
  3731.     move.b    PortUpOldValB(a6),d7
  3732. NoOldPortUpB
  3733.     move.b    d7,PortUpOldValB(a6)
  3734.     move.b    d7,d3
  3735.     and.b    #$f0,d7
  3736.     cmp.b    #$f0,d7
  3737.     beq.w    FineSU
  3738.     move.b    d3,d7
  3739.  
  3740.     lsl.w    #2,d7
  3741.     sub.w    d7,d0
  3742.  
  3743. ;    cmp.w    #113,d0
  3744. ;    bge.s    PortUpOkB
  3745. ;    move.w    #113,d0
  3746. ;PortUpOkB
  3747. ;    rts
  3748.  
  3749.     move.w    d0,VibratoDatasA(a6)
  3750.     move.w    d0,VibratoDatasB(a6)
  3751. NoPortUp:
  3752.     rts
  3753.  
  3754. ; ------------- portamento down -------------
  3755. PortDown:
  3756.     moveq    #0,d7
  3757.     move.b    d3,d7
  3758.  
  3759.     tst.b    channelenable
  3760.     bne.s    PortDown_chan_b
  3761. PortDown_chan_a
  3762.     tst.b    d7
  3763.     bne.s    NoOldPortDownA
  3764.     move.b    PortDownOldValA(a6),d7
  3765. NoOldPortDownA
  3766.     move.b    d7,PortDownOldValA(a6)
  3767.     move.b    d7,d3
  3768.     and.b    #$f0,d7
  3769.     cmp.b    #$f0,d7
  3770.     beq.w    FineSD
  3771.     move.b    d3,d7
  3772.  
  3773.     lsl.w    #2,d7
  3774.     add.w    d7,d0
  3775. ;    cmp.w    #856,d0
  3776. ;    ble.s    PortDownOkA
  3777. ;    move.w    #856,d0
  3778. ;PortDownOkA
  3779.     move.w    d0,VibratoDatasA(a6)
  3780.     move.w    d0,VibratoDatasB(a6)
  3781.     rts
  3782.  
  3783. PortDown_chan_b
  3784.     tst.b    d7
  3785.     bne.s    NoOldPortDownB
  3786.     move.b    PortDownOldValB(a6),d7
  3787. NoOldPortDownB
  3788.     move.b    d7,PortDownOldValB(a6)
  3789.     move.b    d7,d3
  3790.     and.b    #$f0,d7
  3791.     cmp.b    #$f0,d7
  3792.     beq.w    FineSD
  3793.     move.b    d3,d7
  3794.  
  3795.     lsl.w    #2,d7
  3796.     add.w    d7,d0
  3797. ;    cmp.w    #856,d0
  3798. ;    ble.s    PortDownOkB
  3799. ;    move.w    #856,d0
  3800. ;PortDownOkB
  3801.     move.w    d0,VibratoDatasA(a6)
  3802.     move.w    d0,VibratoDatasB(a6)
  3803. noPortDown:
  3804.     rts
  3805.  
  3806. ; --------------- set global volume  -------------
  3807. SetGlobalVolume:
  3808.     moveq    #0,d7
  3809.     move.b    d3,d7
  3810.     move.w    d7,GlobalVol
  3811.     rts
  3812. ; ------------- slide global volume  -------------
  3813. SlideGlobalVolume:
  3814.     tst.b    d3
  3815.     bne.s    .NoOldSlideVol
  3816.     move.b    (a5),d3    ; Old SlideVolValue
  3817. .NoOldSlideVol
  3818.     move.b    d3,(a5)
  3819.  
  3820.     moveq    #0,d7
  3821.     move.b    d3,d7
  3822.     cmp.w    #$10,d7
  3823.     blt.s    .Voldown
  3824.  
  3825.     moveq    #0,d7
  3826.     move.b    d3,d7
  3827.     lsr.b    #4,d7
  3828.     add.w    d7,GlobalVol
  3829.     cmp.w    #64,GlobalVol
  3830.     blt.s    .Voldone
  3831.     move.w    #64,GlobalVol
  3832.     rts
  3833. .Voldown
  3834.     moveq    #0,d7
  3835.     move.b    d3,d7
  3836.     sub.w    d7,GlobalVol
  3837.     tst.w    GlobalVol
  3838.     bgt.s    .Voldone
  3839.     clr.w    GlobalVol
  3840. .Voldone:
  3841.     rts
  3842.  
  3843. ; ------------- slide offset -------------
  3844. SlideOffset:
  3845.     tst.b    d3
  3846.     bne.s    .NoOldSlide
  3847.     move.b    (a5),d3    ; Old SlideOffset
  3848. .NoOldSlide
  3849.     move.b    d3,(a5)
  3850.  
  3851.     moveq    #0,d7
  3852.     move.b    d3,d7
  3853.     cmp.w    #$10,d7
  3854.     blt.s    .down
  3855.  
  3856.     moveq    #0,d7
  3857.     move.b    d3,d7
  3858.     lsr.b    #4,d7
  3859.     add.w    d7,SlideSamOffset(a6)
  3860.     rts
  3861. .down
  3862.     moveq    #0,d7
  3863.     move.b    d3,d7
  3864.     sub.w    d7,SlideSamOffset(a6)
  3865.     tst.w    SlideSamOffset(a6)
  3866.     bgt.s    .done
  3867.     clr.w    SlideSamOffset(a6)
  3868. .done:
  3869.     rts
  3870.  
  3871. ; --------------- set volume  -------------
  3872. SetVolume:
  3873.     moveq    #0,d7
  3874.     move.b    d3,d7
  3875.     lsl.w    #8,d7
  3876.     move.w    d7,(a5)
  3877.     rts
  3878.  
  3879. ; --------------- slide volume up -------------
  3880. SlideVolume:
  3881.     tst.b    d3
  3882.     bne.s    NoOldSlideVol
  3883.     move.b    2(a5),d3    ; Old SlideVolVolue
  3884. NoOldSlideVol
  3885.     move.b    d3,2(a5)
  3886.  
  3887.     moveq    #0,d7
  3888.     move.b    d3,d7
  3889.     cmp.w    #$10,d7
  3890.     blt.s    Voldown
  3891.  
  3892.     and.b    #$0f,d7
  3893.     cmp.b    #$0f,d7
  3894.     beq.s    FineVol
  3895.     move.b    d3,d7
  3896.     and.b    #$f0,d7
  3897.     cmp.b    #$f0,d7
  3898.     beq.s    FineVol
  3899.  
  3900.     moveq    #0,d7
  3901.     move.b    d3,d7
  3902.     lsr.b    #4,d7
  3903.     lsl.w    #8,d7
  3904.     add.w    d7,VolA(a6)
  3905.     cmp.w    #64*256,VolA(a6)
  3906.     blt.s    Voldone
  3907.     move.w    #64*256,VolA(a6)
  3908.     rts
  3909. Voldown
  3910. ;    and.b    #$f0,d7
  3911.  
  3912.     moveq    #0,d7
  3913.     move.b    d3,d7
  3914.     lsl.w    #8,d7
  3915.     sub.w    d7,VolA(a6)
  3916.     tst.w    VolA(a6)
  3917.     bgt.s    Voldone
  3918.     clr.w    VolA(a6)
  3919. Voldone:rts
  3920.  
  3921.  
  3922. FineVol:
  3923.     cmp.b    #$0f,d7
  3924.     beq.s    .FineUp
  3925.     moveq    #0,d7
  3926.     move.b    d3,d7
  3927.     and.b    #$0f,d7
  3928.     add.w    #$eb0,d7
  3929.     move.w    d7,d3
  3930.     bsr    FineVolDown
  3931.     rts
  3932. .FineUp:
  3933.     moveq    #0,d7
  3934.     move.b    d3,d7
  3935.     lsr.b    #4,d7
  3936.     add.w    #$ea0,d7
  3937.     move.w    d7,d3
  3938.     bsr    FineVolUp
  3939.     rts
  3940.  
  3941. FineSU:
  3942.     moveq    #0,d7
  3943.     move.b    d3,d7
  3944.     and.b    #$0f,d7
  3945. ;    add.w    #$ea0,d7
  3946.     move.w    d7,d3
  3947.     bsr    FineSlideUp
  3948.     rts
  3949. FineSD:
  3950.     moveq    #0,d7
  3951.     move.b    d3,d7
  3952.     and.b    #$0f,d7
  3953. ;    add.w    #$eb0,d7
  3954.     move.w    d7,d3
  3955.     bsr    FineSlideDown
  3956.     rts
  3957.  
  3958.  
  3959. ; --------------- fine slide down -------------
  3960. FineSlideDown:
  3961.     move.w    d3,d7
  3962.     and.w    #$000f,d7
  3963.     lsl.w    #2,d7
  3964.  
  3965.     tst.b    channelenable
  3966.     bne.s    FineSlideDownB
  3967.  
  3968.     add.w    d7,d0
  3969. ;    cmp.w    #856,d0
  3970. ;    ble.s    FineSlideDownOkA
  3971. ;    move.w    #856,d0
  3972. ;FineSlideDownOkA
  3973.     moveq    #0,d2
  3974.  
  3975.     move.w    d0,VibratoDatasA(a6)
  3976.     move.w    d0,VibratoDatasB(a6)
  3977.     rts
  3978.  
  3979. FineSlideDownB
  3980.     add.w    d7,d0
  3981. ;    cmp.w    #856,d0
  3982. ;    ble.s    FineSlideDownOkB
  3983. ;    move.w    #856,d0
  3984. ;FineSlideDownOkB
  3985.     moveq    #0,d6
  3986.     move.w    d0,VibratoDatasA(a6)
  3987.     move.w    d0,VibratoDatasB(a6)
  3988.     rts
  3989.  
  3990. ; --------------- fine slide up -------------
  3991. FineSlideUp:
  3992.     move.w    d3,d7
  3993.     and.w    #$000f,d7
  3994.     lsl.w    #2,d7
  3995.  
  3996.     tst.b    channelenable
  3997.     bne.s    FineSlideUpB
  3998.  
  3999.     sub.w    d7,d0
  4000. ;    cmp.w    #113,d0
  4001. ;    bge.s    FineSlideUpOkA
  4002. ;    move.w    #113,d0
  4003. ;FineSlideUpOkA
  4004.     moveq    #0,d2
  4005.     move.w    d0,VibratoDatasA(a6)
  4006.     move.w    d0,VibratoDatasB(a6)
  4007.     rts
  4008.  
  4009. FineSlideUpB
  4010.     sub.w    d7,d0
  4011.  
  4012. ;    cmp.w    #113,d0
  4013. ;    bge.s    FineSlideUpOkB
  4014. ;    move.w    #113,d0
  4015. ;FineSlideUpOkB
  4016.     moveq    #0,d6
  4017.     move.w    d0,VibratoDatasA(a6)
  4018.     move.w    d0,VibratoDatasB(a6)
  4019.     rts
  4020.  
  4021. ; --------------- fine volume up  -------------
  4022. FineVolUp:
  4023.     move.w    d3,d7
  4024.     and.w    #$000f,d7
  4025.     lsl.w    #8,d7
  4026.     add.w    d7,VolA(a6)
  4027.     cmp.w    #64*256,VolA(a6)
  4028.     blt.s    FVUOK
  4029.     move.w    #64*256,VolA(a6)
  4030. FVUOK
  4031.     tst.b    channelenable
  4032.     bne.s    FVUClrVolB
  4033.     moveq    #0,d2
  4034.     rts
  4035. FVUClrVolB
  4036.     moveq    #0,d6
  4037.     rts
  4038.  
  4039.  
  4040. ; --------------- fine volume down  -------------
  4041. FineVolDown:
  4042.     move.w    d3,d7
  4043.     and.w    #$000f,d7
  4044.     lsl.w    #8,d7
  4045.     sub.w    d7,VolA(a6)
  4046.     tst.w    VolA(a6)
  4047.     bge.s    FVDOK
  4048.     clr.w    VolA(a6)
  4049. FVDOK
  4050.     tst.b    channelenable
  4051.     bne.s    FVDClrVolB
  4052.     moveq    #0,d2
  4053.     rts
  4054. FVDClrVolB
  4055.     moveq    #0,d6
  4056. NoFVD    rts
  4057.  
  4058.  
  4059. ; ------------- glissando -------------
  4060.  
  4061. ;GlissOldValue:         (a5)
  4062. ;GlissEnable:        1(a5)
  4063. ;GlissOldPeriod:    2(a5)
  4064. ;GlissNewPeriod:    4(a5)
  4065.  
  4066. Glissando:
  4067.     move.w    d3,d7
  4068.     tst.b    d3
  4069.     bne.s    NoOLDgliss
  4070.     move.b    (a5),d3
  4071. NoOLDgliss
  4072.  
  4073.     cmp.b    #1,count
  4074.     bne.s    NoStore
  4075.     move.b    d3,(a5)
  4076. NoStore
  4077.     lea    GlissandoDatasA(a6),a5
  4078.  
  4079.     tst.w    2(a5)
  4080.     beq.w    GlissRTS
  4081.  
  4082. ;    tst.b    channelenable
  4083. ;    bne.s    GlissOK1B
  4084.  
  4085. GlissOK1A:
  4086.     tst.w    4(a5)
  4087.     bne.s    GlissOk2
  4088.     move.w    d0,d7
  4089.     move.w    d0,4(a5)
  4090.     move.w    2(a5),d0
  4091.     clr.b    1(a5)
  4092.     cmp.w    d0,d7
  4093.     beq.s    ClrNP
  4094.     bge.w    GlissRTS
  4095.     move.b    #1,1(a5)
  4096.     rts
  4097.  
  4098. ;GlissOK1B:
  4099. ;    tst.w    4(a5)
  4100. ;    bne.s    GlissOk2
  4101. ;    move.w    d4,d7
  4102. ;    move.w    d4,4(a5)
  4103. ;    move.w    2(a5),d4
  4104. ;    clr.b    1(a5)
  4105. ;    cmp.w    d4,d7
  4106. ;    beq.s    ClrNP
  4107. ;    bge.s    GlissRTS
  4108. ;    move.b    #1,1(a5)
  4109. ;    rts
  4110.  
  4111. ClrNP:    clr.w    4(a5)
  4112.     rts
  4113.  
  4114. GlissOk2:
  4115.     move.w    d3,d7
  4116.     and.w    #$0ff,d7
  4117.     tst.w    4(a5)
  4118.     beq.s    Glissrts
  4119.     tst.b    1(a5)
  4120.     bne.s    Glisssub
  4121.     lsl.w    #2,d7
  4122.     add.w    d7,2(a5)
  4123.     move.w    4(a5),d7
  4124.     cmp.w    2(a5),d7
  4125.     bgt.s    GlissOK3
  4126.     move.w    4(a5),2(a5)
  4127.     clr.w    4(a5)
  4128. GlissOK3:
  4129. ;    tst.b    channelenable
  4130. ;    bne.s    GlissChanB
  4131. ;GlissChanA
  4132.     move.w    2(a5),d0
  4133.     move.w    d0,VibratoDatasA(a6)
  4134.     move.w    d0,VibratoDatasB(a6)
  4135.     rts
  4136.  
  4137. ;GlissChanB
  4138. ;    move.w    2(a5),d0
  4139. ;    rts
  4140.  
  4141. Glisssub:
  4142.     lsl.w    #2,d7
  4143.     sub.w    d7,2(a5)
  4144.     move.w    4(a5),d7
  4145.     cmp.w    2(a5),d7
  4146.     blt.s    GlissOK3
  4147.     move.w    4(a5),2(a5)
  4148.     clr.w    4(a5)
  4149.     bra.s    GlissOK3
  4150.  
  4151. Glissrts:
  4152.     rts
  4153.  
  4154. SlideVolGliss:
  4155.     and.w    #$00ff,d3
  4156.     add.w    #$a00,d3
  4157.     tst.b    channelenable
  4158.     bne.s    SlideChanB
  4159.     lea    VolA(a6),a5
  4160.     bra.s    DoSlideChan
  4161. SlideChanB
  4162.     lea    VolB(a6),a5
  4163. DoSlideChan
  4164.     bsr    SlideVolume
  4165.  
  4166.     move.w    #$0300,d3
  4167.     tst.b    channelenable
  4168.     bne.s    GlissBChan
  4169.     lea    GlissandoDatasA(a6),a5
  4170.     tst.w    d2
  4171.     bne.s    .ok
  4172.     move.w    #$0300,d2
  4173. .ok
  4174.     bra.s    DoGlissChan
  4175. GlissBChan
  4176.     tst.w    d6
  4177.     bne.s    .ok
  4178.     move.w    #$0300,d6
  4179. .ok
  4180.     lea    GlissandoDatasB(a6),a5
  4181. DoGlissChan
  4182.     bra    Glissando
  4183.  
  4184.  
  4185. SlideVolVib:
  4186.     and.w    #$00ff,d3
  4187.     add.w    #$a00,d3
  4188.     tst.b    channelenable
  4189.     bne.s    SlideChanBV
  4190.     lea    VolA(a6),a5
  4191.     bra.s    DoSlideChanV
  4192. SlideChanBV
  4193.     lea    VolB(a6),a5
  4194. DoSlideChanV
  4195.     bsr    SlideVolume
  4196.  
  4197.     move.w    #$0400,d3
  4198.     tst.b    channelenable
  4199.     bne.s    VibBChan
  4200.     lea    VibratoDatasA(a6),a5
  4201.     tst.w    d2
  4202.     bne.s    .ok
  4203.     move.w    #$0400,d2
  4204. .ok
  4205.     bra.s    DoVibChan
  4206. VibBChan
  4207.     lea    VibratoDatasB(a6),a5
  4208.     tst.w    d6
  4209.     bne.s    .ok
  4210.     move.w    #$0400,d6
  4211. .ok
  4212. DoVibChan
  4213.     bra    Vibrato
  4214.  
  4215.  
  4216.  
  4217.  
  4218. ;VibPeriod    (a5)
  4219. ;VibValue    2(a5)
  4220. ;ViboldValue    3(a5)
  4221.  
  4222. Vibrato:
  4223.     movem.l    d2/d5,-(sp)
  4224.  
  4225.     move.w    d0,d2
  4226. ;    tst.b    channelenable
  4227. ;    bne.s    VibCHANB1
  4228. ;    move.w    d0,d2
  4229. ;VibCHANB1
  4230.     bsr    VibratoMain
  4231. ;    tst.b    channelenable
  4232. ;    bne.s    VibCHANB2
  4233. ;    move.w    d2,d0
  4234. ;    bra.s    VibMainDone
  4235. ;VibCHANB2
  4236.     move.w    d2,d0
  4237. VibMainDone
  4238.     movem.l    (sp)+,d2/d5
  4239.     rts
  4240.  
  4241. VibratoMain:
  4242.     move.b    Count(pc),d7
  4243.     cmp.b    Temp(pc),d7
  4244.     bne.s    NoNewPeriod
  4245.     tst.w    (a5)
  4246.     bne.s    NoNewPeriod
  4247.     move.w    d2,(a5)
  4248. NoNewPeriod
  4249.     move.w    (a5),d2
  4250.     move.b    temp(pc),d7
  4251.     subq    #1,d7
  4252.     cmp.b    count(pc),d7
  4253.     bne.s    DoVibrato
  4254.     clr.w    (a5)
  4255.     rts
  4256. DoVibrato
  4257.     move.b    d3,d5
  4258.     and.b    #$0f,d5
  4259.     bne.s    NoNew1
  4260.     move.b    3(a5),d5
  4261.     and.b    #$0f,d5
  4262.     add.b    d5,d3
  4263. NoNew1
  4264.     move.b    d3,d5
  4265.     and.b    #$f0,d5
  4266.     bne.s    NoNew2
  4267.     move.b    3(a5),d5
  4268.     and.b    #$f0,d5
  4269.     add.b    d5,d3
  4270. NoNew2
  4271.     move.w    d3,-(sp)
  4272.  
  4273.     move.b    d3,3(a5)
  4274.  
  4275.     move.b    d3,d7
  4276.     move.b    2(a5),d3
  4277.     lsr.w    #2,d3
  4278.     and.w    #$1f,d3
  4279.     moveq    #0,d5
  4280.     move.b    VibSin(pc,d3.w),d5
  4281.     mulu    #5,d5
  4282.     divu    #3,d5
  4283.     and.l    #$ffff,d5
  4284.  
  4285.     move.b    d7,d3
  4286.     and.w    #$f,d3
  4287.     mulu    d3,d5
  4288.     lsr.w    #7,d5
  4289.  
  4290.     tst.b    2(a5)
  4291.     bmi.s    VibSub
  4292.     add.w    d5,d2
  4293.     bra.s    VibNext
  4294. VibSub:
  4295.     sub.w    d5,d2
  4296. VibNext:
  4297.     move.w    d2,d5
  4298.     move.b    d7,d5
  4299.     lsr.w    #2,d5
  4300.     and.w    #$3c,d5
  4301.     add.b    d5,2(a5)
  4302.     move.w    (sp)+,d3
  4303.     rts
  4304.  
  4305. VibSin:
  4306.     dc.b    $00,$18,$31,$4a,$61,$78,$8d,$a1,$b4,$c5,$d4,$e0,$eb,$f4,$fa,$fd
  4307.     dc.b    $ff,$fd,$fa,$f4,$eb,$e0,$d4,$c5,$b4,$a1,$8d,$78,$61,$4a,$31,$18
  4308.  
  4309. Hex:
  4310.  dc.b    0,1,2,3,4,5,6,7,8,9,0,0,0,0,0,0,10,11,12,13,14,15,16,17,18,19
  4311.  dc.b    0,0,0,0,0,0,20,21,22,23,24,25,26,27,28,29,0,0,0,0,0,0,30,31
  4312.  dc.b    32,33,34,35,36,37,38,39,0,0,0,0,0,0,40,41,42,43,44,45,46,47
  4313.  dc.b    48,49,0,0,0,0,0,0,50,51,52,53,54,55,56,57,58,59,0,0,0,0,0,0
  4314.  dc.b    60,61,62,63,64,65,66,67,68,69,0,0,0,0,0,0
  4315.  dc.b    70,71,72,73,74,75,76,77,78,79,0,0,0,0,0,0
  4316.  dc.b    80,81,82,83,84,85,86,87,88,89,0,0,0,0,0,0
  4317.  dc.b    90,91,92,93,94,95,96,97,98,99,0,0,0,0,0,0
  4318.  even
  4319.  
  4320.  
  4321. PERIODS:
  4322.  dc.w    856*16,808*16,762*16,720*16,678*16,640*16,604*16,570*16,538*16,508*16,480*16,453*16
  4323.  dc.w    856*8,808*8,762*8,720*8,678*8,640*8,604*8,570*8,538*8,508*8,480*8,453*8
  4324.  dc.w    856*4,808*4,762*4,720*4,678*4,640*4,604*4,570*4,538*4,508*4,480*4,453*4
  4325.  dc.w    428*4,404*4,381*4,360*4,339*4,320*4,302*4,285*4,269*4,254*4,240*4,226*4
  4326.  dc.w    214*4,202*4,190*4,180*4,170*4,160*4,151*4,143*4,135*4,127*4,120*4,113*4
  4327.  dc.w    214*2,202*2,190*2,180*2,170*2,160*2,151*2,143*2,135*2,127*2,120*2,113*2
  4328.  dc.w    214,202,190,180,170,160,151,143,135,127,120,113
  4329.  dc.w    214/2,202/2,190/2,180/2,170/2,160/2,151/2,143/2,135/2,127/2,120/2,113/2
  4330. PERIODSEND:
  4331.  
  4332.  
  4333.  
  4334.     SECTION    DATA,BSS_p
  4335.  
  4336. UnPackedData:    ds.l    128*6
  4337. PattAdresses:    ds.l    1024
  4338. PATTLENS:    ds.w    1024
  4339.  
  4340. SAMVOL:        ds.b    256
  4341. Instruments:    ds.w    256
  4342. SampleType:    ds.b    256    ; 0-8bit ; 1-16bit
  4343.         ds.b    256    ; original
  4344. LoopTab:    ds.b    256
  4345. SAMFIN:        ds.l    256
  4346. SONGORDERS:    ds.w    1024+1
  4347.  
  4348. SONGORDERS0:    ds.w    1024+1
  4349. SONGORDERS1:    ds.w    1024+1
  4350. SONGORDERS2:    ds.w    1024+1
  4351. SONGORDERS3:    ds.w    1024+1
  4352. SONGORDERS4:    ds.w    1024+1
  4353.  
  4354. ahi_samples    ds.b    (4*4)*256
  4355. ModNameBuffer:    ds.b    44
  4356. SongNameBuffer:    ds.b    44
  4357.  
  4358. SongNameBuffer0:ds.b    44
  4359. SongNameBuffer1:ds.b    44
  4360. SongNameBuffer2:ds.b    44
  4361. SongNameBuffer3:ds.b    44
  4362. SongNameBuffer4:ds.b    44
  4363.  
  4364. InstrNames:    ds.b    256*30
  4365.  
  4366.  
  4367. VolEnvelope:    ds.b    [[32*4]+6]*256    ; 1 - type / 2 - point number
  4368.  
  4369. SamBuff:    ds.b    32*(1024+16)
  4370.  
  4371. SampleOffsets    ds.l    128+2
  4372. SampleOffsetsFT    ds.b    128+2
  4373.  
  4374.  
  4375. ; Channels
  4376. Channel1:    ds.b    ChanArea*128
  4377. ahi_channels    ds.l    128
  4378.  
  4379.  
  4380.  
  4381. MODBUFFER:
  4382.     ds.b    128*128-1572
  4383.     ds.b    1572
  4384. Tap_Buffer1:
  4385.     ds.b    2048
  4386. TAP_Buffer2:
  4387.     ds.b    2048
  4388. PackedPattLen:
  4389.     ds.w    1
  4390.  
  4391.     SECTION    NAME,DATA_p
  4392.  
  4393. NM:    dc.b    'dh2:.dbm',0
  4394.     even
  4395.